2016-12-12 2 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 BY и count(*) фраза затем get multiple duplicate results затем фильтровать их, чтобы получить все детали likers поста, но это, безусловно, замедлить мои серверы вниз. Поэтому я уже пробовал это.

Любая помощь будет очень признательна.

+1

Вы можете использовать 'GROUP_CONCAT (любит. Liker) .. '. Но способность «GROUP_CONCAT» должна быть скорректирована, если ваш размер данных растет. – 1000111

+2

Ваш текущий запрос не имеет смысла, потому что вы выбираете неагрегатные столбцы с 'GROUP BY'. –

+0

@TimBiegeleisen это имеет смысл, и я получаю результаты, затронутые «GROUP BY», но он группирует все и выбирает первый результат каждой группы, и если я удалю его, он возвращает все результаты, но с повторяющимися строками, которые совпадали, но я просто хотел захватите только поле userid из таблицы likers. что так трудно понять? – 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

Смежные вопросы