#mysql #sql #join #count
#mysql #sql #Присоединиться #количество
Вопрос:
Когда я ушел — объедините эти две таблицы «сообщения» и «комментарии»:
SELECT *
FROM `posts`
---- -----------
| id | post_text |
---- -----------
| 1 | test0 |
| 2 | test1 |
| 3 | test2 |
| 4 | test3 |
| 5 | test4 |
| 6 | test5 |
| 7 | test6 |
| 8 | test7 |
| 9 | test8 |
| 10 | test9 |
| 11 | test10 |
---- -----------
SELECT *
FROM `comments`
---- ------------------------------------------ ---------
| id | comment | post_id |
---- ------------------------------------------ ---------
| 1 | hello there | 4 |
| 2 | this is another comment on the same post | 4 |
| 3 | this is a comment on a different post | 7 |
---- ------------------------------------------ ---------
Я получаю следующее:
SELECT posts.id, post_id, COUNT( * )
FROM posts
LEFT JOIN posts ON posts.id = comments.post_id
GROUP BY posts.id
---------- --------- ----------
| posts.id | post_id | COUNT(*) |
---------- --------- ----------
| 4 | 4 | 2 |
| 7 | 7 | 1 |
| ... | ... | ... |
| ... | ... | ... |
---------- --------- ----------
Что я хотел бы сделать, так это там, где COUNT(*) больше 1 (что означает, что в сообщении более одного комментария), показать все совпадающие записи, вместо того, чтобы группировать их в одну строку, так что это так:
---------- --------- ----------
| posts.id | post_id | COUNT(*) |
---------- --------- ----------
| 4 | 4 | 1 |
| 4 | 4 | 1 |
| 7 | 7 | 1 |
| ... | ... | ... |
| ... | ... | ... |
---------- --------- ----------
Комментарии:
1. Просто отбросьте
count
иgroup by
. Если вы все еще хотите показать количество комментариев, изменитеcount(*)
на(select count(1) from comments where post_id = posts.id) as comment_count
2. О, круто, спасибо, чувак. Наверное, я упустил из виду значение «ГРУППИРОВАТЬ ПО»
Ответ №1:
Если вы удалите count
и group by
, вы можете выбрать все записи. Чтобы по-прежнему показывать количество комментариев на сообщение, вы можете использовать коррелированный подзапрос.
Кроме того, я бы предположил, что вы на самом деле не хотите показывать оба posts.id
, и post_id
поскольку они имеют одинаковое значение, поэтому следующий запрос должен быть больше похож на ваше намерение:
select posts.id as post_id, comments.id as comment_id, (select count(1) from comments where post_id = posts.id) as comment_count
from posts
left join comments on posts.id = comments.post_id
Комментарии:
1. Я обнаружил проблему — когда я повторяю SQL с помощью PHP, он дублирует значения (post_id: 4), когда я хотел, чтобы оно было напечатано только один раз
2. @user1228907 ваш пример того, как должен выглядеть результат, включает
post_id: 4
в себя дважды?3. Ну, на самом деле я не хочу, чтобы он повторялся дважды, но я могу использовать его для упорядочивания комментариев по последнему опубликованному комментарию (используя столбец временных меток, который я исключил из таблицы комментариев)
4. Похоже, вам может потребоваться переделать вашу логику PHP. Вероятно, выберите все сообщения, затем в определенном представлении сообщения выберите все его комментарии, упорядоченные по убыванию даты вставки или что-то в этом роде.
5. Я пытаюсь выбрать все сообщения и упорядочить их по последним комментариям, но я не могу этого сделать, когда COUNT(*) группирует их вместе!