2013-06-03 2 views
0

Добрые люди Stackoverflow, я в настоящее время борется с небольшой частью моего последнего проекта.MySQL Query для выбора 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

Смежные вопросы