Tarafından grup ile veritabanından rastgele kayıt alma

2 Cevap php

Merhaba ben bir veritabanından rastgele girişleri toplama üzerinde bir sorum var. Ben 4 tablolar, ürün tekliflerini ve autobids ve kullanıcımız var.

Products
-------  
id 20,21,22,23,24(prime_key)
price...........
etc...........

users  
-------
id(prim_key)  
name user1,user2,user3  
etc  

bids  
-------
product_id  
user_id  
created  

autobids  
--------
user_id   
product_id 

Şimdi birden fazla kullanıcı, bir ürün üzerinde bir OtomatikTeklif olabilir. Yani bir sonraki teklif sahibi için ben OtomatikTeklif tablodan rastgele bir kullanıcıyı seçmek istiyorum

dilde sorgu örneği:

OtomatikTeklif tablodaki her bir ürün için ben son İstekli olmayan rastgele bir kullanıcıyı istiyorum.

On product 20 has user1,user2,user3 an autobidding.
On product 21 has user1,user2,user3 an autobidding

Sonra böyle örneğin görünen bir resultset istiyorum

20 – user2
21 – user3

Sadece rastgele bir kullanıcı. Ben GOUP BY (product_id) miximg ve RAND () yapmaya çalıştık, ama ben sadece ondan doğru değerleri alınamıyor. Şimdi rastgele bir kullanıcıyı alıyorum, ama onunla gitmek tüm değerleri eşleşmiyor.

Birisi bana bu sorgu oluşturmak lütfen yardım edebilir, ben php ve mysql kullanıyorum

2 Cevap

Çözümün ilk bölümü, her bir ürün için son teklifi tanımlanması ile ilgilidir: bu sonuçta "latest_bid" geçici bir tabloda rüzgar.

Sonra, her bir ürün için her OtomatikTeklif için randon rütbe değerleri atamak - Her bir ürün için son teklif hariç. Daha sonra her bir ürün için en yüksek rütbe değeri seçin, ve sonra çıktı bu en yüksek rütbe değerlere sahip autobids ve User_id ve product_id.

create temporary table lastbids (product_id int not null, 
                                 created datetime not null, 
                                 primary key( product_id, created ) );

insert into lastbids 
select product_id, max(created)
from bids
group by product_id;

create temporary table latest_bid ( user_id int not null, 
                                    product_id int not null, 
                                    primary key( user_id, product_id) );

insert into latest_bid
select product_id, user_id 
from bids b
join lastbids lb on lb.product_id = b.product_id and lb.created = b.created;

create temporary table rank ( user_id int not null, 
                              product_id int not null, 
                              rank float not null, 
                              primary key( product_id, rank ));

# "ignore" duplicates - it should not matter
# left join on latest_bid to exclude latest_bid for each product

insert ignore into rank 
select user_id, product_id, rand() 
from autobids a
left join latest_bid lb on a.user_id = lb.user_id and a.product_id = lb.product_id 
where lb.user_id is null;

create temporary table choice 
as select product_id,max(rank) choice 
   from rank group by product_id;

select user_id, res.product_id from rank res
join choice on res.product_id = choice.product_id and res.rank = choice.choice;

Sen HAZIRLA sunucu tarafı ile birlikte SINIR deyimini kullanabilirsiniz.

İşte tablo mysql.help_category rastgele bir satırı seçer bir örnek:

select @choice:= (rand() * count(*)) from mysql.help_category;
prepare rand_msg from 'select * from mysql.help_category limit ?,1';
execute rand_msg using @choice;
deallocate prepare rand_msg;

Bu @ seçim sıfır olma önlemek için rafine gerekir, ama genel bir fikir çalışır.

Alternatif olarak, uygulama ilk seçme çalışan ve sabit kodlanmış bir sınır değeri ile ikinci select oluşturarak sayısını kendisi oluşturabiliriz:

select count(*) from mysql.help_category;
# application then calculates limit value and constructs the select statement:   
select * from mysql.help_category limit 5,1;