SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 07.06.2011 14:49:41

marco_manti
Участник
Зарегистрирован: 07.06.2011
Сообщений: 2

Выборка из связанных таблиц

Есть база (в прикрепленном файле). Все вроде просто, но не могу составить запрос.

Надо выбрать все репорты и прикрученные к ним файлы, т.е. репорт один, а файлов много. В итоге на выходе должен быть список report_id, description, timestamp, files, где files - строка, склеенная из files.name (file1.txt,file2.txt,file3.txt и т.д.). Проблема еще в том, что запрос должен быть один.

Погуглив у меня получился запрос:


SELECT r.id, r.description, r.timestamp,
GROUP_CONCAT (
    SELECT f.name
    FROM report_files AS rf
    LEFT JOIN files AS f ON f.id = rf.file_id
) AS files
FROM reports AS r
WHERE location_id IN (SELECT id FROM locations WHERE  latitude >= 53.7576898341 AND latitude <= 54.0468241659 AND longitude >= 27.3171088402 AND longitude <= 27.8061711598)
 

Но этот запрос выкидывает ошибку #1064 - You have an error in your SQL syntax; ... to use near 'SELECT f.name FROM ..., хотя и сам запрос и подзапрос работают, но из-за GROUP_CONCAT вылетает ошибка.

P.S. Задача стандарная, но видно для нее мой мозг не работает(

Неактивен

 

#2 07.06.2011 15:51:53

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Выборка из связанных таблиц

Хорошо проверьте название полей, возможно не совсем правильно составлены связи.
Но в общем я думаю вам нужно что такое.


    SELECT r.id, r.description, r.timestamp,GROUP_CONCAT(f.name)
    FROM reports AS r
    LEFT JOIN report_files AS rf ON r.id = rf.report_id
    LEFT JOIN files AS f ON f.id = rf.file_id
    LEFT JOIN locations AS loc ON r.location_id = loc.id
    WHERE  loc.latitude >= 53.7576898341 AND loc.latitude <= 54.0468241659 AND loc.longitude >= 27.3171088402 AND loc.longitude <= 27.8061711598
group by r.id;
 

Неактивен

 

#3 07.06.2011 16:18:05

marco_manti
Участник
Зарегистрирован: 07.06.2011
Сообщений: 2

Re: Выборка из связанных таблиц

evgeny написал:

Хорошо проверьте название полей, возможно не совсем правильно составлены связи.
Но в общем я думаю вам нужно что такое.


    SELECT r.id, r.description, r.timestamp,GROUP_CONCAT(f.name)
    FROM reports AS r
    LEFT JOIN report_files AS rf ON r.id = rf.report_id
    LEFT JOIN files AS f ON f.id = rf.file_id
    LEFT JOIN locations AS loc ON r.location_id = loc.id
    WHERE  loc.latitude >= 53.7576898341 AND loc.latitude <= 54.0468241659 AND loc.longitude >= 27.3171088402 AND loc.longitude <= 27.8061711598
group by r.id;
 

Спасибо, заработало!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson