2013-06-03 39 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