세 개의 테이블에서 세는 방법은?
테이블이 3개 있습니다.post
,post_like
그리고.post_comment
.
숫자를 세고 싶습니다.likes
그리고.comments
사용자가 게시한 게시물:
게시물:
+-------------+--------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+-------------------+----------------+
| id | int(30) | NO | PRI | NULL | auto_increment |
| user_id | int(11) | NO | | 0 | |
| description | text | YES | | NULL | |
| link | varchar(100) | YES | | '' | |
+-------------+--------------+------+-----+-------------------+----------------+
post_like:
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| post_id | int(30) | NO | | 0 | |
| user_id | int(30) | NO | | 0 | |
| time | varchar(50) | NO | | 0 | |
+---------+-------------+------+-----+---------+----------------+
post_comment:
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(30) | NO | PRI | NULL | auto_increment |
| post_id | int(20) | NO | | 0 | |
| user_id | int(20) | NO | | 0 | |
| text | text | YES | | NULL | |
| time | varchar(100) | NO | | 0 | |
+---------+--------------+------+-----+---------+----------------+
다음은 제가 생각해낸 질문입니다.
SELECT
p.*,
COUNT(l.post_id) "likes",
COUNT(c.post_id) "comments"
FROM
post p
INNER JOIN post_like l ON p.id = l.post_id
INNER JOIN post_comment c ON c.post_id = l.post_id
WHERE
p.user_id=55
GROUP BY
l.post_id
ORDER BY
p.created_at DESC
문제는 쿼리가 하나의 행만 반환하는 반면 게시물이 여러 개 있다는 것입니다.
여러 가지 요령을 시도해 보고 비슷한 문제를 살펴보았지만 해결책을 찾을 수 없었습니다.
어떻게 고치죠?
당신이 원하는 것을 신속하고 더러운 방법으로 하는 것입니다.count(distinct)
:
SELECT p.id, p.user_id, p.description, p.link,
COUNT(DISTINCT l.id) as num_likes,
COUNT(DISTINCT c.id) as num_comments
FROM post p LEFT JOIN
post_like l
ON p.id = l.post_id LEFT JOIN
post_comment c
ON p.id = c.post_id
WHERE p.user_id=55
GROUP BY p.id, p.user_id, p.description, p.link
ORDER BY p.created_at DESC;
더 발전된 방법은 당신보다 먼저 집계하는 것입니다.join
, 하지만 이 방법이 데이터에 적합할 것입니다.
언급URL : https://stackoverflow.com/questions/54102062/how-to-count-from-three-tables
'programing' 카테고리의 다른 글
MySQL 성능: 단일 테이블 및 파티션에서 여러 개의 테이블 대 인덱스 (0) | 2023.10.14 |
---|---|
강한 포인터와 약한 포인터는 무엇입니까? (0) | 2023.10.14 |
Spring Security Expressions에서 정적 메서드를 호출합니까? (0) | 2023.10.14 |
스위치 내부에 LIKE가 있는 MySQL의 선택 쿼리 (0) | 2023.10.14 |
데이터 프레임에서 열 순서를 지정하여 그룹(사분위수, 분위수 등)을 신속하게 구성하는 방법 (0) | 2023.10.14 |