2013-06-03 165 views
0

Stackoverflow的人們,我目前正在爲我的最新項目的一小部分努力。MySQL查詢從一個子查詢中加入5條記錄

當前正在使用圖片庫。

爲簡單起見,我有兩個表:

**albums** 
album_id, album_title 


**media** 
media_id, album_id, media_title 

我需要顯示5張專輯的列表,並且對每個相冊最多在相冊5項的媒體。

所以我想我的查詢選擇5張專輯,然後高達5種介質具有相同album_id

我想和可能出現的問題的最小數量執行此,並且也儘可能最佳的性能項目(所以我已經通過獲取所有專輯,獲取所有媒體,然後遍歷它們來實現這一目標,但如果某些專輯包含數百個媒體項目,則無法擴展)。

我總是很欣賞我在這裏得到的奇妙幫助。謝謝。

回答

2

您可以通過使用group_concat()得到一個逗號分隔的列表中選擇介質:

select a.*, 
     substring_index(group_concat(distinct m.media_title), ',', 5) 
from albums a join 
    media m 
    on a.album_id = m.album_id 
group by a.album_id 
limit 5; 
+0

哦,好的。我沒有想過這樣做。我故意簡化了我的OP表結構。媒體表格連接到其他表格,並有更多字段,因此最終將媒體記錄作爲PHP中的關聯數組而非逗號分隔會更有用。但是,這是一個很好的解決方案。 – SpongeBobPHPPants

1

舉例來說...

CREATE TABLE colours(colour_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,colour VARCHAR(20) NOT NULL); 

INSERT INTO colours VALUES (1,'red'),(2,'orange'),(3,'yellow'),(4,'green'),(5,'blue'),(6,'indigo'),(7,'violet'); 

CREATE TABLE things 
(thing VARCHAR(20) NOT NULL PRIMARY KEY,colour VARCHAR(20)); 

INSERT INTO things VALUES 
('tomato','red'), 
('cherry','red'), 
('heart','red'), 
('ferrari','red'), 
('chrysanthemum','orange'), 
('orange','orange'), 
('banana','yellow'), 
('lemon','yellow'), 
('sunflower','yellow'), 
('caterpillar','green'), 
('cucumber','green'), 
('grass','green'), 
('sky','blue'), 
('suede shoes','blue'), 
('bluebell','blue'), 
('indigo bunting','indigo'), 
('violets','violet'); 


SELECT c.colour 
    , y.thing 
    FROM colours c 
    JOIN things x 
    ON x.colour = c.colour 
    JOIN things y 
    ON y.colour = x.colour 
    AND y.thing <= x.thing 
WHERE c.colour_id <=3 
GROUP 
    BY c.colour,x.thing 
HAVING COUNT(*) <=3 
ORDER 
    BY colour_id; 
+--------+---------------+ 
| colour | thing   | 
+--------+---------------+ 
| red | cherry  | 
| red | cherry  | 
| red | cherry  | 
| orange | chrysanthemum | 
| orange | chrysanthemum | 
| yellow | banana  | 
| yellow | banana  | 
| yellow | banana  | 
+--------+---------------+ 

http://www.sqlfiddle.com/#!2/36937/1