Таблицы в этом запросе выглядят следующим образом:
Я пытаюсь запросить всю релевантную информацию о почте, которая имеет такие отношения, как Пользователь, который опубликовал сообщение, комментарии к этой конкретной Почте, многие или теги в Почте и категорию, в которой находится Почта.
Вот мой SQL-запрос:
$sql = "SELECT post.*, user.name, user.avatar, group_concat(DISTINCT tag.slug) as tags, post_category.slug as category, count(comment.post_id) as comments
FROM post
INNER JOIN user on user.id = post.user_id
INNER JOIN post_category on post_category.id = post.category_id
LEFT JOIN tagged_post on tagged_post.post_id = post.id
LEFT JOIN tag on tagged_post.tag_id = tag.id
LEFT OUTER JOIN comment on post.id = comment.post_id
GROUP BY post.id";
Это обеспечивает следующее:
Array
(
[0] => Array
(
[id] => 1
[user_id] => 1
[category_id] => 1
[title] => Hi, I'm Bob Ross. AMA
[body] => That right. I'm bob ross and this is my post. I'm not dead btw
[date_created] => 2018-09-02 11:45:29
[date_modified] =>
[name] => bob_ross
[avatar] =>
[tags] => painting,ama
[category] => news-and-politics
[comments] => 6
)
[1] => Array
(
[id] => 2
[user_id] => 2
[category_id] => 2
[title] => I'm Saul Goodman!!
[body] => woohoo
[date_created] => 2018-09-02 12:12:12
[date_modified] =>
[name] => saul_goodman
[avatar] =>
[tags] =>
[category] => general-discussion
[comments] => 0
)
[2] => Array
(
[id] => 3
[user_id] => 3
[category_id] => 4
[title] => yo im jesse
[body] => test
[date_created] => 2018-09-02 12:24:45
[date_modified] =>
[name] => jesse_pinkman
[avatar] =>
[tags] => ama,painting
[category] => animals-and-nature
[comments] => 4
)
)
Количество меток, похоже, влияет на количество комментариев. Например, в первом посте есть 3 комментария и 2 тега. Число комментариев для сообщения с идентификатором 1 показывает 6. Если бы я добавил дополнительный тег в этот пост (3 общих тега), тогда число комментариев отобразило бы 9 (3 тега x 3 комментария).
Может кто-нибудь помочь мне понять, почему это происходит?
Причина в том, что использование нескольких JOIN
действует как декартово произведение, поэтому вы получаете 2 * 3 = 6 строк для группы. Когда вы применяете счет, вы получаете 6 действительных (не нулевых) значений и ваш результат.
Чтобы исправить, используйте:
... COUNT(DISTINCT comment.comment_id) as comments
GROUP BY post.id
но в списке много столбцов, которые не являются ниpost.id
ни аргументом функции агрегации. Хотя старые или слабо сконфигурированные версии MySQL (я полагаю, это ваша СУБД?) Принимают это, результаты могут быть забавными.