MySQL запрос с несколькими JOIN

Вопросы и ответыРубрика: MySQLMySQL запрос с несколькими JOIN
0 +1 -1
Александр спросил 6 лет назад

Тема, судя по форумам, избитая, но, тем не менее, прошу помочь решить проблему:
Связываем таблицы:
turnir(id, name, id_type) — перечень турниров,
common(id, id_turnir, id_user, score,…..) — результаты спортсменов,
user(id, fam, imya,….) — данные спортсменов
type(id, name…) — типы соревнований

‘SELECT  t.data1, t.data2, t.name as tname, u.fam, u.imya, c.score, c.gruppa
FROM turnir t
LEFT JOIN common c ON t.id   = c.turnir
LEFT JOIN user u   ON c.user = u.id
ORDER BY data2 DESC, c.gruppa, c.score DESC ‘

Все работает ! Но как только пытаюсь к turnir подключить словарь type (SELECT… y.name… +JOIN type y ON t.type = y.id)- все рушится.
Получается, что если имеется цепочка связей — работает, но как только к turnir подключается ещё одна таблица — полный бенц!
Как быть?
Конечно, могу в turnir добавить такие же поля, как и в type ,и заполнять их из type, а в запросе таблицу type и вовсе не использовать, но дело в принципе. Но не получается.
Спасибо.

1 ответ
0 +1 -1
Роман Чернышов Админ. ответил 6 лет назад

Добрый день! Для начала попробуйте выполнить запрос в БД через PHPMyAdmint, он покажет статус выполнения и если есть ошибки в самом запросе, то сообщить о них.

Также запрос может возвращать нулевое значение, если в таблице type не найдено соответствий для выбираемых строк из turnir. Т.е., если у сроки в таблице turnir значение поля type равно нулю, а в таблице turnir нет строк со значением поля id равным также нулю — эти сроки выбраны и возвращены запросом не будут. Убедитесь, что в полях turnir.type и полях type.id есть одинаковые значения для соответствия.

Если в таблице type есть поле data2, то ваш запрос будет падать с ошибкой сортировки выборки. Так как в запросе явно не указано по полю из какой таблицы производить сортировку: ORDER BY data2 DESC, замените на ORDER BY t.data2 DESC.

Как вариант для выборки из type добавить в запрос — подзапрос, таким образом:
‘SELECT  t.data1, t.data2, t.name as tname, u.fam, u.imya, c.score, c.gruppa,
(SELECT y.name FROM type y WHERE t.type = y.id) AS yname
FROM turnir t
LEFT JOIN common c ON t.id   = c.turnir
LEFT JOIN user u   ON c.user = u.id
ORDER BY data2 DESC, c.gruppa, c.score DESC ‘

Автор блога
Роман Чернышов
Веб-разработчик,
Full Stack
Senior, Architect
PHP, JavaScript, Node.JS, Python, HTML 5, CSS 3, MySQL, Bash, Linux Admin
Заказать работу
предложить оффер

Моя книга
Книга. Веб-разработчик. Легкий вход в профессию
Печатная книга
Веб-разработчик.
Легкий вход в профессию
Оформить предзаказ
Последние вопросы
Список вопросов
Последние комментарии
Меню

Archive

Мои проекты
Insurance CMS Love Crm CMS Совместные покупки Мой PHP Framework Хостинг для моих клиентов Лицензии на мой софт и поддержка