我有三张桌子
用户
id
name
报告
id
id_user
comments
ReportedUser
id
id_report
id_user
我想列出每个报告及其报告的用户,但我不知道如何进行正确的查询。
我使用了内部联接,但它显示了来自ReportedUser表的所有记录,显示两次或更多(取决于报告用户在报告中的报告方式)相同的报告。
我知道我可以在编程语言(PHP)中做到这一点,但我需要使用LIKE运算符来过滤信息等等。是否可以在MySQL中执行此操作?
答案 0 :(得分:0)
如果您的数据看起来像这样
drop table if exists report;
create table report(id int, name varchar(3));
insert into report values
(1,'abc'),(2,'def'),(3,'ghi');
drop table if exists report_user;
create table report_user (user_id int, report_id int);
insert into report_user values
(1,1),(1,2),
(2,1),
(3,1),(3,3);
您可以使用group_concat
MariaDB [sandbox]> select r.id,r.name report, group_concat(u.username order by u.username asc) useby
-> from report r
-> join report_user ru on ru.report_id = r.id
-> join users u on u.id = ru.user_id
-> group by r.id,r.name
-> ;
+------+--------+---------------+
| id | report | useby |
+------+--------+---------------+
| 1 | abc | Ali,Jane,John |
| 2 | def | John |
| 3 | ghi | Ali |
+------+--------+---------------+
3 rows in set (0.02 sec)
或相反
MariaDB [sandbox]> select u.id,u.username, group_concat(r.name order by r.name asc) reportsused
-> from users u
-> join report_user ru on ru.user_id = u.id
-> join report r on r.id = ru.report_id
-> group by u.id,u.username
-> ;
+----+----------+-------------+
| id | username | reportsused |
+----+----------+-------------+
| 1 | John | abc,def |
| 2 | Jane | abc |
| 3 | Ali | abc,ghi |
+----+----------+-------------+
3 rows in set (0.00 sec)