2016-12-12 121 views
0

所以我已經到處搜索這個,但我找不到這個特定的關係。下面的查詢返回用戶的所有帖子以及喜歡該帖子的人數,因爲我使用了GROUP BY postid,這意味着如果結果重複其自身但具有相同的postid,那麼它們將被分組。MYSQL得到所有分組結果一個查詢與行數


SELECT posts.id postid,posts.post_body,posts.post_type, ALLUSERS.USERNAME, 
     likes.liker,likes.target, 
     plikers.*, 
     COUNT(posts.id) numberOflikes 

FROM posts 
INNER JOIN ALLUSERS ON(ALLUSERS.USERID=posts.FROM_userid) 
LEFT JOIN likes ON(likes.target=posts.id) 
LEFT JOIN(SELECT USERID pl_id FROM ALLUSERS)plikers ON(pl_id=likes.liker) 
GROUP BY postid 

,結果是...

+--------+-----------------+------------------------+-----------+-------+--------+-------+-----------+---------------+ 
| postid | post_body  | post_type    | USERNAME | liker | target | pl_id | pl_un  | numberOflikes | 
+--------+-----------------+------------------------+-----------+-------+--------+-------+-----------+---------------+ 
|  83 | Southgate  | 20&&03 Saturday/04:05 | Superuser | NULL | NULL | NULL | NULL  |    1 | 
|  84 | Great post!  | 10&&03 Saturday/04:07 | Superuser |  4 | 84  |  4 | dennisrec |    7 | 
|  85 | How delightful? | 10&&03 Saturday/04:07 | Superuser | 43 | 85  | 43 | zerCon |    1 | 
|  87 | Cheers...  | 10&&07 Wednesday/01:53 | Superuser | NULL | NULL | NULL | NULL  |    1 | 
|  88 | check this out! | 20&&07 Wednesday/03:31 | Superuser | NULL | NULL | NULL | NULL  |    1 | 
+--------+-----------------+------------------------+-----------+-------+--------+-------+-----------+---------------+ 

這是正確的,但這種只返回分組的第一個結果。 那麼任務站,有沒有什麼辦法可以返回一個查詢中所有組的所有結果

現在顯然我可以只取出GROUP BYcount(*)短語,則get multiple duplicate results然後過濾他們獲得那個職位的likers的所有細節,但是這肯定會慢,我的服務器了。所以我已經嘗試過了。

任何幫助將非常感激。

+1

你可以用'GROUP_CONCAT(喜歡的。類似器)...'。但是,如果數據量增大,則需要調整「GROUP_CONCAT」的容量。 – 1000111

+2

您當前的查詢沒有意義,因爲您正在使用「GROUP BY」選擇非聚合列。 –

+0

@TimBiegeleisen @TimBiegeleisen它確實有意義,我得到的結果受到「GROUP BY」的影響,但它將所有組合並選擇每個組的第一個結果,如果我刪除它將返回所有結果,但重複的行匹配,但我只是想只抓取likers表中的userid字段。有什麼難以理解的? – Dennisrec

回答

1

如果你的模型看起來像這樣

MariaDB [sandbox]> select * from posts; 
+------+-----------+-----------+-------------+ 
| id | post_body | post_type | from_userid | 
+------+-----------+-----------+-------------+ 
| 1 | POST1  | NULL  |   1 | 
| 2 | POST2  | NULL  |   2 | 
+------+-----------+-----------+-------------+ 
2 rows in set (0.00 sec) 

MariaDB [sandbox]> select * from likes; 
+------+--------+-------+ 
| id | TARGET | liker | 
+------+--------+-------+ 
| 1 |  1 |  3 | 
| 2 |  1 |  7 | 
| 3 |  2 |  8 | 
| 3 |  2 |  6 | 
+------+--------+-------+ 
4 rows in set (0.00 sec) 

MariaDB [sandbox]> select * from users where id < 9; 
+----+----------+-----------+--------+---------------------+ 
| id | userName | photo  | status | ts     | 
+----+----------+-----------+--------+---------------------+ 
| 1 | John  | john.png |  1 | 2016-12-08 13:14:24 | 
| 2 | Jane  | jane.png |  1 | 2016-12-08 13:14:24 | 
| 3 | Ali  |   |  1 | 2016-12-08 13:14:24 | 
| 6 | Bruce | bruce.png |  1 | 2016-12-08 13:14:24 | 
| 7 | Martha |   |  1 | 2016-12-08 13:14:24 | 
| 8 | Sidney |   |  1 | 2016-12-08 13:14:24 | 
+----+----------+-----------+--------+---------------------+ 
6 rows in set (0.00 sec) 

然後爲@ 1000111建議你可以

MariaDB [sandbox]> SELECT posts.id postid,posts.post_body,posts.post_type,POSTS.FROM_USERID 
    -> , USERS.USERNAME 
    ->  ,GROUP_CONCAT(likes.liker) LIKER 
    -> ,likes.target 
    -> ,GROUP_CONCAT(plikers.pl_id) pl_id 
    ->  ,GROUP_CONCAT(plikers.UNAME) pl_un 
    -> ,COUNT(posts.id) numberOflikes 
    -> 
    -> FROM posts 
    -> INNER JOIN USERS ON USERS.ID=posts.FROM_userid 
    -> LEFT JOIN likes ON likes.target=posts.id 
    -> LEFT JOIN(SELECT ID pl_id, USERNAME UNAME FROM USERS)plikers ON pl_id=likes.liker 
    -> GROUP BY postid; 
+--------+-----------+-----------+-------------+----------+-------+--------+-------+--------------+---------------+ 
| postid | post_body | post_type | FROM_USERID | USERNAME | LIKER | target | pl_id | pl_un  | numberOflikes | 
+--------+-----------+-----------+-------------+----------+-------+--------+-------+--------------+---------------+ 
|  1 | POST1  | NULL  |   1 | John  | 7,3 |  1 | 7,3 | Martha,Ali |    2 | 
|  2 | POST2  | NULL  |   2 | Jane  | 6,8 |  2 | 6,8 | Bruce,Sidney |    2 | 
+--------+-----------+-----------+-------------+----------+-------+--------+-------+--------------+---------------+ 
2 rows in set (0.00 sec) 

,但你應小心警告

+0

你是唯一瞭解我介紹的問題的人!非常感謝,這是非常有道理的。 – Dennisrec

+0

它非常棒! – Dennisrec