2010-05-19 2 views
0

Скажем, у меня есть две таблицы. Один содержит список элементов, а один содержит фотографии предметов.MySQL, присоедините один элемент к нескольким элементам в одном запросе

Что-то вроде этого:

Элементы

+----+---------+ 
| id | name | 
+----+---------+ 
| 1 | oranges | 
| 2 | apples | 
+----+---------+ 

Фотографии

+----+---------+ 
| id | item_id | 
+----+---------+ 
| 1 | 1  | 
| 2 | 2  | 
| 3 | 2  | 
+----+---------+ 

Мой вопрос заключается в следующем: возможно ли это в одном запросе, чтобы выбрать пункт 2 из Items и соедините все строки в Pictures стол, на котором item_id ссылается на тот же идентификатор?

Я уверен, что я пробовал почти все, что мог придумать, но ничего не приходит на ум. Прошу прощения, если ответ на этот вопрос прост, но он просто ускользает от меня прямо сейчас.

EDIT

@Andomar, что работает, но это точно не дает мне результаты, которые я хотел. Я предполагаю, что я должен быть более ясным и спросить, можно ли получить результаты, которые напоминают что-то вроде этого (это массив PHP, но организация, что я после):

$results = array(
    [0] => array(
     'id' => 1, 
     'name' => 'oranges', 
     'images' => array(
      [0] => ..., 
     ), 
    ), 
    [1] => array(
     'id' => 2, 
     'name' => 'apples', 
     'images' => array(
      [0] => ..., 
      [1] => ..., 
     ), 
    ), 
); 

ответ

1
SELECT i.name, GROUP_CONCAT(p.id SEPARATOR ',') AS pictures 
FROM Items i 
LEFT JOIN Pictures p 
    ON p.item_id = i.id 
WHERE i.id = 2

Без GROUP_CONCAT он будет возвращать другую строку для каждого согласованного Picture. Сгруппировав результаты из таблицы Pictures, вы можете получить одну строку в результате.

+0

Я отредактировал вопрос, но ваш запрос кажется действительно близким к тому, что я искал. На самом деле это не является частью исходного вопроса, но мне было интересно, есть ли способ сделать что-то внутри оператора GROUP_CONCAT, например this ((p.name + "." + P.extension) ", чтобы в итоге результат вроде 'img1.png, img2.png'? – bschaeffer

+1

Для этого можно использовать 'CONCAT', например:' GROUP_CONCAT (CONCAT ('img', p.id, '.png') SEPARATOR ',') '. – Alec

2

Объединение должно сделать трюк :

select * 
from Items i 
left join Pictures p on p.item_id = i.id 
where i.id = 2 
+0

Спасибо за быстрый ответ. Он отлично работает ... но я думаю, мне следовало бы более четко узнать, какие желаемые результаты. Я отредактировал вопрос и был бы очень признателен за любые другие материалы, которые у вас могут быть. – bschaeffer

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