я хочу показать одному конкретному блогу сколько лайков и сколько комментариев, используя запрос sql - PullRequest
0 голосов
/ 15 апреля 2020

Таблица блога:

| bid  | btitle  |
|  29  | ......  |
|  38  | ......  |

таблица лайков:

| lid | bid |
|  1  | 29  |
|  2  | 29  |
|  3  | 29  |
|  4  | 38  |
|  5  | 38  |

таблица комментариев

| commid | bid |
|    1   | 29  |
|    2   | 29  |
|    3   | 38  |

Я пробовал следующий запрос, но он не будет работать для я:

SELECT blog.bid,blog.btitle,COUNT(likes.lid) AS likecnt,COUNT(comment.comid) AS commentcnt FROM blog,likes,comment WHERE blog.bid=likes.bid AND blog.bid=comment.bid GROUP BY blog.bid

я хочу вывод как:

| bid  | btitle  | likecnt | commentcnt |
|  29  | ......  |   3     |   2        |
|  38  | ......  |   2     |   1        |

Ответы [ 3 ]

2 голосов
/ 15 апреля 2020

Вы можете сделать left join с отдельной агрегацией:

select b.bid, b.btitle, 
       coalesce(l.likecnt, 0) as likecnt, 
       coalesce(c.commentcnt, 0) as commentcnt
from blog b left join
     (select l.bid, count(*) as likecnt
      from likes l
      group by l.bid
     ) l
     on l.bid = b.bid left join
     (select c.bid, count(*) as commentcnt
      from comment c
      group by c.bid
     ) c
     on c.bid = l.bid;

Если вы хотите только сопоставить bid s, используйте INNER JOIN вместо LEFT JOIN и удалите COALESCE().

1 голос
/ 15 апреля 2020

Во многих случаях коррелированные подзапросы могут быть самым быстрым решением:

select b.bid, b.btitle, 
       (select count(*) from likes l where l.bid = b.bid) as num_likes,
       (select count(*) from comment c where c.bid = b.bid) as num_comments
from blog b;

Когда это выигрышная производительность. Во-первых, вы хотите индексы на likes(bid) и comments(bid). С этими индексами это может быть самый быстрый подход для вашего запроса.

Особенно лучше, если у вас есть предложение where, фильтрующее блоги во внешнем запросе. Нужно только подсчитать количество блогов в наборе результатов.

0 голосов
/ 15 апреля 2020

Используйте правильные объединения и считайте значения DISTINCT, так как множественные объединения увеличивают количество возвращаемых строк:

SELECT b.bid, b.btitle, 
  COUNT(DISTINCT l.lid) AS likecnt,
  COUNT(DISTINCT c.comid) AS commentcnt 
FROM blog b 
LEFT JOIN likes l ON b.bid = l.bid
LEFT JOIN comment c ON b.bid = c.bid 
GROUP BY b.bid, b.btitle

См. Демонстрационную версию . Я использую LEFT объединений на тот случай, если для поста нет комментариев или лайков. Результаты:

| bid | btitle | likecnt | commentcnt |
| --- | ------ | ------- | ---------- |
| 29  | ...... | 3       | 2          |
| 38  | ...... | 2       | 1          |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...