2017-05-31 72 views
0

我正在運行一個mysql數據庫。我有兩個表分別存儲喜歡和評論。從兩個表中找出唯一的ID並從兩個表中找到相應的計數

喜歡錶:

+--------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+--------------+------------------+------+-----+---------+----------------+ 
| id   | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| post_id  | int(11)   | NO |  | NULL |    | 
| user_id  | varchar(255)  | NO |  | NULL |    | 
| created_at | timestamp  | YES |  | NULL |    | 
| updated_at | timestamp  | YES |  | NULL |    | 
+--------------+------------------+------+-----+---------+----------------+ 

評論表:

+--------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+--------------+------------------+------+-----+---------+----------------+ 
| id   | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| post_id  | int(11)   | NO |  | NULL |    | 
| user_id  | varchar(255)  | NO |  | NULL |    | 
| comment  | varchar(255)  | NO |  | NULL |    | 
| created_at | timestamp  | YES |  | NULL |    | 
| updated_at | timestamp  | YES |  | NULL |    | 
+--------------+------------------+------+-----+---------+----------------+ 

我需要獲得唯一的用戶ID和他們的喜好和評論數。

我跑下面的查詢:

select * from 
(select user_id, count(*) as like_count from post_likes group by user_id) as a, 
(select user_id, count(*) as comment_count from post_comments group by user_id) as b 
limit 5 

查詢了66秒1.8萬條記錄(這兩個表的組合)。另外,它沒有給出正確的結果。

如果我做了一個LEFT JOIN,它只返回來自左表的匹配記錄,而我需要兩個,即如果一個用戶ID只有喜歡和沒有評論或只有評論和不喜歡。

什麼我試圖得到的是這樣的:

+--------------+------------------+------+-----+---------+ 
| user_id  | like_count  | comment_count  | 
+--------------+------------------+------+-----+---------+ 
| 1   | 1213    | 310     | 
| 2   | 1098    | 0     | 
| 3   | 0    | 115     | 
+--------------+------------------+------+-----+---------+ 
+2

難道你沒有'user'表嗎? – HoneyBadger

+0

我當然可以。我還沒有在這裏加入,因爲我只需要用戶的幫助。 – gentrobot

回答

2

做一個UNION ALL代替,然後合併行:

select user_id, sum(like_count), sum(comment_count) 
from 
(
    select user_id, count(*) as like_count, null as comment_count 
    from post_likes 
    group by user_id 
    union all 
    select user_id, null, count(*) 
    from post_comments 
    group by user_id 
) as dt 
group by user_id 
+0

這工作完美。謝謝。使用臨時表對其進行測試以替換內部查詢,因爲整個查詢是隻能每天運行一次的cron的一部分。測試以查看臨時表是否會提高查詢的性能。腳本結束後,我可以刪除表格。將張貼我的發現。您的見解將不勝感激。再次感謝。 – gentrobot

3

一個理想的辦法是LEFT JOIN用戶表,例如:

SELECT u.user_id, COUNT(l.id), COUNT(c.id) 
FROM users u LEFT JOIN Likes l ON u.user_id = l.user_id 
LEFT JOIN Comments c ON u.user_id = c.user_id; 
0

一種方法是使用UNION ALL有條件聚集

SELECT user_id, 
     SUM(type='likes') AS like_count, 
     SUM(type='comments') AS comment_count 
FROM (
    SELECT user_id, 'likes' AS type 
    FROM post_likes 

    UNION ALL 

    SELECT user_id, 'comments' AS type 
    FROM post_comments) AS t 
GROUP BY user_id 

這個查詢將不會返回無喜無評論用戶。

相關問題