Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Проблема с SQL запросом (https://javascript.ru/forum/server/69684-problema-s-sql-zaprosom.html)

DivMan 12.07.2017 09:58

Проблема с 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


laimas 12.07.2017 10:35

Цитата:

Сообщение от DivMan
данные путаются, неправильно подставляются логины, города и улицы, почему?

Потому, что так нельзя. Либо подзапрос этого же набора с подсчетом количества, либо получить количество возвращенное запросом. Это уж смотря для чего, но судя по отсутствию LIMIT, запариваться с подзапросом смысла нет.

Alexandroppolus 12.07.2017 10:53

насколько я знаю, нельзя просто взять все "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

DivMan 12.07.2017 19:49

Спасибо


Часовой пояс GMT +3, время: 23:26.