2015-10-07 2 views
0

У меня есть таблица под названием работы и таблица под названием изображения. Одна работа может иметь несколько изображений. У меня есть work_id в таблице изображений которая содержит ссылки на идентификатор таблицы работает. Я пытаюсь создать единый запрос для извлечения всех работ и всех связанных изображений каждой работы.Стол для таблицы Mysql с несколькими рядами

На данный момент я могу получить все работы, но только 1 строку из таблицы изображений. Вот запрос.

SELECT w.id, w.title, i.imPath 
FROM works w 
LEFT JOIN images i ON w.id=i.work_id 
WHERE w.isActive=1 
GROUP BY w.id 
ORDER BY w.ordr 

Любая помощь в том, как получить все строки в таблицах изображений для каждой работы?

Спасибо

ответ

2

Удалить GROUP BY.

SELECT w.id, w.title, i.imPath 
FROM works w 
LEFT JOIN images i ON w.id=i.work_id 
WHERE w.isActive=1 
ORDER BY w.ordr 

Это должно дать вам все строки, которые вы желаете.

Другой способ смотреть на это:

create table works(id int, title varchar(10)); 
insert into works values (1, 'hello'), (2, 'world'); 

create table images(id int, work_id int, impath varchar(100)) 
insert into images values (1, 1, '/data/hello1.png'), (2, 1, '/data/hello2.png'), (3, 2, '/data/world1.png'); 

Работы

id | title 
1 | hello 
2 | world 

Изображения

id | work_id | impath 
1 | 1  | /data/hello1.png 
2 | 1  | /data/hello2.png 
3 | 2  | /data/world1.png 

который может быть переведен на что-то подобное в вашем случае:

SELECT w.id, w.title, 
     GROUP_CONCAT(DISTINCT i.imPath ORDER BY i.imPath SEPARATOR ',') AS images 
FROM works w 
LEFT JOIN images i ON w.id=i.work_id 
WHERE w.isActive=1 
GROUP BY w.id, w.title 
ORDER BY w.ordr 

Result: 
id | title | images 
1 | hello | /data/hello1.png,/data/hello2.png 
2 | world | /data/world1.png 

SQLFiddle пример: http://sqlfiddle.com/#!9/b5784c/1

Чтобы получить заголовок изображения, а также, вы могли бы сделать что-то вроде этого:

SELECT w.id, w.title, 
     GROUP_CONCAT(
      DISTINCT CONCAT(i.imPath,'|',i.caption) 
      ORDER BY CONCAT(i.imPath,'|',i.caption) 
      SEPARATOR ',') AS images 
FROM works w 
LEFT JOIN images i ON w.id=i.work_id 
WHERE w.isActive=1 
GROUP BY w.id, w.title 
ORDER BY w.ordr 
+0

Да, вы правы, однако, что я хочу добиться того, чтобы получить для каждой работы кратному изображений. Если я удалю группу, то я получаю данные работы несколько раз. – ion

+0

Я добавил расширение ответа. Это то, что вы искали @ion? – zedfoxus

+0

Thats great !! Есть ли способ получить изображения в виде массива, а не строки? Я имею в виду, что я мог бы сделать это позже с помощью php, но я хотел бы как можно больше достичь с помощью mysql. – ion

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