2012-05-06 99 views
4

這裏是我的2個表,ID爲內連接事件。我想做這件事:mysql group by table b,inner join table a for a random

在表b中,有10 albums,我想隨機出去4 albums。那麼each album選擇one record,該記錄是在專輯中的隨機位置。

這樣我就會得到4條記錄回到(these 4 records with no duplicate id),然後把這4條記錄作爲內部聯接查詢,從table a得到title

這裏只是爲了測試的小記錄。實際上,我在表a中有300,000條記錄,在表b中有200萬條記錄。

+-----+-------+ 
| id | title | 
+-----+-------+ 
| 1 | a1 | 
+-----+-------+ 
| 2 | a2 | 
+-----+-------+ 
| 3 | a3 | 
+-----+-------+ 
| 4 | a4 | 
+-----+-------+ 
| 5 | a5 | 
+-----+-------+ 
| 6 | a6 | 
+-----+-------+ 

表B

+-----+--------+ 
| id | album | 
+-----+--------+ 
| 1 | album1 | 
+-----+--------+ 
| 2 | album1 | 
+-----+--------+ 
| 3 | album1 | 
+-----+--------+ 
| 6 | album1 | 
+-----+--------+ 
| 2 | album2 | 
+-----+--------+ 
| 3 | album2 | 
+-----+--------+ 
| 5 | album3 | 
+-----+--------+ 
| 6 | album3 | 
+-----+--------+ 
| 3 | album4 | 
+-----+--------+ 
| 2 | album5 | 
+-----+--------+ 
| 4 | album5 | 
+-----+--------+ 
| 5 | album5 | 
+-----+--------+ 
| 1 | album6 | 
+-----+--------+ 
| 3 | album6 | 
+-----+--------+ 
| 2 | album7 | 
+-----+--------+ 
| 4 | album7 | 
+-----+--------+ 
| 1 | album8 | 
+-----+--------+ 
| 5 | album8 | 
+-----+--------+ 
| 3 | album9 | 
+-----+--------+ 
| 2 | album10| 
+-----+--------+ 
| 5 | album10| 
+-----+--------+ 

我不擅長MySQL查詢。在我心中,我會做

select * from b group by album order by random() limit 0,4 

回來4張專輯,然後做一個內部聯接查詢(此查詢不正確的,如何檢查b.id沒有重複?)

select * from b inner join a on b.id = a.id where (select id from b where b.album = '".$row['album']."' order by random() limit 1) 

我需要一個簡單而快捷的方法,最好的方法就是使用一個查詢。非常感謝。

+0

如果我讀的是正確的,你」我喜歡從你的專輯列表中隨機挑選10張專輯,然後從這10張專輯中隨機挑選一首曲目? –

+0

換句話說,你想隨機選擇4首曲目(這又可以讓你選擇專輯),但是沒有兩首曲目可以屬於同一專輯? –

+0

@Marc B,是的,每個曲目都沒有重複的id。 –

回答

1

AFAIR,「ORDER BY RAND()」是非常慢的解決方案,尤其是在表像你有(2元+記錄),所以我建議尋找類似的這些類型的文章第一句:http://www.greggdev.com/web/articles.php?id=6

所以,你應該知道你的表中的記錄數運行查詢之前,然後做一些事情,如:

"SELECT * FROM `album` LIMIT 1 OFFSET " . rand(0,$count) 

這將返回1排隨機一點更有效,我相信。

另外,我認爲在曲目表中存儲專輯引用作爲字符串並不是一個好主意,但您寧願使用引用albums.id的適當整數外鍵album_id。那麼你可以加入這兩張表更加強大。如果我是你,我會先做:

ALTER TABLE `tracks` add column `album_id` int; 
UPDATE `tracks` SET `album_id` = SUBSTRING(`album`,5); 

然後,這樣做的,與上述解決方案相結合後,推出類似:

"SELECT * FROM `album` INNER JOIN `tracks`ON `tracks`.`album_id` = `albums`.`id` LIMIT 1 OFFSET " . rand(0,$count) 
1

因爲我既不是MySQL專家,也不是PHP專家,所以我會嘗試使用僞代碼和通用SQL。爲了便於閱讀,我已將表格更名爲albumstracks

  1. 首先獲取4個隨機記錄你的PHP應用程序:

    select id from albums order by random() limit 4 
    
  2. 其次,迭代產生的結果集的四個ID,並獲取相應的軌道(僞PHP):

    foreach($album_ids as $id): 
        execute_query("select id from tracks where album_id = ? order by random(), limit 1", $id) 
    

我不明白你是如何將你的曲目與他們的專輯相匹配的。你應該有tracks.album_id作爲albums.id的外鍵,這就是我設計我的查詢的方式。您應該適當調整,我的解決方案背後的基本邏輯應該保持不變。