0

Stackoverflow 的好心人,我目前正在为我最新项目的一小部分而苦苦挣扎。

目前正在使用图片库。

为简单起见,我有两个表:

**albums**
album_id, album_title


**media**
media_id, album_id, media_title

我需要显示一个包含 5 个专辑的列表,并且对于每个专辑,该专辑中最多有 5 个媒体项目。

所以我希望我的查询选择 5 个专辑,然后选择最多 5 个具有相同专辑 ID 的媒体项目

我想以尽可能少的查询数量和尽可能好的性能来执行此操作(所以我已经通过获取所有专辑、获取所有媒体然后循环遍历它们来完成这项工作,但如果有的话,那是不可扩展的专辑包含数百个媒体项目)。

我总是很感激我在这里得到的出色帮助。谢谢你。

4

2 回答 2

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;
于 2013-06-03T14:11:37.210 回答
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

于 2013-06-03T14:55:15.753 回答