Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.07.2017, 09:58
Профессор
Отправить личное сообщение для DivMan Посмотреть профиль Найти все сообщения от DivMan
 
Регистрация: 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
Ответить с цитированием
  #2 (permalink)  
Старый 12.07.2017, 10:35
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от DivMan
данные путаются, неправильно подставляются логины, города и улицы, почему?
Потому, что так нельзя. Либо подзапрос этого же набора с подсчетом количества, либо получить количество возвращенное запросом. Это уж смотря для чего, но судя по отсутствию LIMIT, запариваться с подзапросом смысла нет.
Ответить с цитированием
  #3 (permalink)  
Старый 12.07.2017, 10:53
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 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
Ответить с цитированием
  #4 (permalink)  
Старый 12.07.2017, 19:49
Профессор
Отправить личное сообщение для DivMan Посмотреть профиль Найти все сообщения от DivMan
 
Регистрация: 08.03.2016
Сообщений: 429

Спасибо
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прошу раскритиковать наслойку работы с MySql. Alasdair Node.JS 4 21.11.2015 20:06
проблема с get запросом FearOfTheHamster AJAX и COMET 4 19.02.2014 15:10
проблема с mysql запросом bushstas Серверные языки и технологии 0 29.01.2013 20:34
Проблема с GET запросом Арсений AJAX и COMET 1 14.05.2010 20:21
Проблема с Ajax запросом в IE и Opera flash_uz AJAX и COMET 0 30.04.2009 15:08