СОЕДИНЕНИЕ СЛЕВА показывает повторяющиеся совпадения

#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
 

Вот демонстрация SQL Fiddle.

Комментарии:

1. Я обнаружил проблему — когда я повторяю SQL с помощью PHP, он дублирует значения (post_id: 4), когда я хотел, чтобы оно было напечатано только один раз

2. @user1228907 ваш пример того, как должен выглядеть результат, включает post_id: 4 в себя дважды?

3. Ну, на самом деле я не хочу, чтобы он повторялся дважды, но я могу использовать его для упорядочивания комментариев по последнему опубликованному комментарию (используя столбец временных меток, который я исключил из таблицы комментариев)

4. Похоже, вам может потребоваться переделать вашу логику PHP. Вероятно, выберите все сообщения, затем в определенном представлении сообщения выберите все его комментарии, упорядоченные по убыванию даты вставки или что-то в этом роде.

5. Я пытаюсь выбрать все сообщения и упорядочить их по последним комментариям, но я не могу этого сделать, когда COUNT(*) группирует их вместе!