programing

세 개의 테이블에서 세는 방법은?

bestprogram 2023. 10. 14. 10:25

세 개의 테이블에서 세는 방법은?

테이블이 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