2016-12-12 153 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