Поэтому я искал везде для этого, но я не могу найти это конкретное отношение. Следующий запрос возвращает все сообщения от пользователя и количество людей, которым понравилась почта, потому что я использовал postid
GROUP BY, означающий, что если результат повторяется, но имеет один и тот же postid
то они группируются.
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
сообщениях, но это, несомненно, замедлит работу моих серверов. Поэтому я уже пробовал это.
Любая помощь будет в значительной степени оценена.
Если ваша модель выглядит так
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)
но вы должны помнить о предостережении