2013-05-21 2 views
1

У меня есть три таблицыОбъединения таблиц MySQL в хитром способе

стола лиц,

id | name 

табличных файлы

id | person_data | person_id 

стол элементы

id | item_name | file_id 

Каждый человек имеет несколько файлов и каждый файл имеет много элементов. Есть ли способ, чтобы выбрать для каждого человека, все это предметы, используя только MySQL возвращающееся что-то вроде этого:

person - file_id -> item 1, file_id -> item 2, file_id -> item 3 

Я думал о каком-то типе JOIN, я попытался все комбинации, которые я мог себе представить, но я думаю, что присоединиться это не решение, или ...

+0

'ВЫБРАТЬ ITEM_NAME FROM элементов РЕГИСТРИРУЙТЕСЬ файлы на file_id = files.id РЕГИСТРИРУЙТЕСЬ лиц НА person_id = persons.id WHERE persons.id = 1'? –

+1

Я думаю, что вы ищете [Group Concat] (http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat) – Ibu

+0

@RocketHazmat я хочу получить все лица со всеми их предметами, и использовать результат в цикле, как человек foreach, получить все предметы – user348078

ответ

3
SELECT ti.id, ti.item_name 
FROM TableItems ti 
INNER JOIN TableFiles tf ON tf.id = ti.file_id 
INNER JOIN TablePersons tp ON tp.id = tf.person_id 
WHERE tp.id = :id 

Где :id является id человека, которому вы хотите перечислить пункты для.

+2

'id' в вашем SELECT неоднозначен. –

+0

Я только что исправил его, спасибо! –

+0

как я сказал @Rocket Hazmat, я хочу, чтобы все люди со всеми своими вещами в одном запросе. – user348078

5

Использование GROUP_CONCAT .Please проверить SQLFiddle

SELECT 
    b.id,b.name, 
    GROUP_CONCAT(b.items SEPARATOR '|') 
FROM (SELECT 
     p.id,p.name, 
     CONCAT(f.id,' -> ', GROUP_CONCAT(i.item_name)) AS items 
     FROM persons p, 
     files f, 
     items i 
     WHERE p.id = f.person_id 
      AND f.id = i.file_id 
     GROUP BY f.id) AS b 
GROUP BY b.id 
+0

это не святой Грааль, но я самый близкий ответ, мне все же нужно еще больше изменить возвращаемый результат, поскольку предметы приходят caoncatenated – user348078

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