12.07.2017, 09:58
|
Профессор
|
|
Регистрация: 08.03.2016
Сообщений: 429
|
|
Проблема с SQL запросом
У меня есть запрос, который выводит статьи и все данные, которые относят к ней.
Код:
|
SELECT
questions.id,
questions.question_name,
questions.answer,
questions.variant1,
questions.variant2,
questions.variant3,
questions.variant4,
questions.user_id,
questions.city_id,
questions.street_id,
questions.date,
questions.img,
users.login,
city.city_name,
street.street_name
FROM questions
INNER JOIN users
INNER JOIN city
INNER JOIN street
ON questions.user_id = users.id
AND questions.city_id = city.id
AND questions.street_id = street.id
GROUP BY questions.id ORDER BY `date` DESC |
Но если добавить ещё подсчёт комментариев, то данные путаются, неправильно подставляются логины, города и улицы, почему?
Код:
|
SELECT
questions.id,
questions.question_name,
questions.answer,
questions.variant1,
questions.variant2,
questions.variant3,
questions.variant4,
questions.user_id,
questions.city_id,
questions.street_id,
questions.date,
questions.img,
users.login,
city.city_name,
street.street_name,
COUNT(comments.questions_id) as countComment
FROM questions
INNER JOIN users
INNER JOIN city
INNER JOIN street
LEFT JOIN comments
ON questions.user_id = users.id
AND questions.city_id = city.id
AND questions.street_id = street.id
AND comments.questions_id = questions.id
GROUP BY questions.id ORDER BY `date` DESC |
|
|
12.07.2017, 10:35
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от DivMan
|
данные путаются, неправильно подставляются логины, города и улицы, почему?
|
Потому, что так нельзя. Либо подзапрос этого же набора с подсчетом количества, либо получить количество возвращенное запросом. Это уж смотря для чего, но судя по отсутствию LIMIT, запариваться с подзапросом смысла нет.
|
|
12.07.2017, 10:53
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
насколько я знаю, нельзя просто взять все "ON" для каждого джойна, и свалить их в одну кучу в конце. Они тогда будут относиться только к последнему джойну. В первом запросе это прокатило, потому что там INNER JOIN, связи один к одному, ссылочная целостность и прочее, т.е. на каждую строку из questions нашлось по одной строке из других таблиц. А с комментами всё по другому.
Кстати, непонятно, зачем GROUP BY в первом запросе.
попробуй так:
SELECT
questions.id,
questions.question_name,
questions.answer,
questions.variant1,
questions.variant2,
questions.variant3,
questions.variant4,
questions.user_id,
questions.city_id,
questions.street_id,
questions.date,
questions.img,
users.login,
city.city_name,
street.street_name,
COUNT(comments.questions_id) as countComment
FROM questions
INNER JOIN users ON questions.user_id = users.id
INNER JOIN city ON questions.city_id = city.id
INNER JOIN street ON questions.street_id = street.id
LEFT JOIN comments ON comments.questions_id = questions.id
GROUP BY questions.id ORDER BY `date` DESC
-------------------------------------------------------------
либо такой вариант (надо посмотреть, что быстрее):
SELECT
questions.id,
questions.question_name,
questions.answer,
questions.variant1,
questions.variant2,
questions.variant3,
questions.variant4,
questions.user_id,
questions.city_id,
questions.street_id,
questions.date,
questions.img,
users.login,
city.city_name,
street.street_name,
comments.countComment
FROM questions
INNER JOIN users ON questions.user_id = users.id
INNER JOIN city ON questions.city_id = city.id
INNER JOIN street ON questions.street_id = street.id
LEFT JOIN (
select id, count(*) as countComment
from comments GROUP BY questions_id
) comments ON comments.questions_id = questions.id
ORDER BY questions.date DESC
|
|
12.07.2017, 19:49
|
Профессор
|
|
Регистрация: 08.03.2016
Сообщений: 429
|
|
Спасибо
|
|
|
|