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

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

Тема, судя по форумам, избитая, но, тем не менее, прошу помочь решить проблему:
Связываем таблицы:
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
Роман Чернышов Админ. ответил 7 лет назад

Добрый день! Для начала попробуйте выполнить запрос в БД через 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
Заказать работу
предложить оффер

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

Archive

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