使用相同的外键

时间:2017-02-20 09:43:32

标签: mysql

我有三张桌子

用户

id
name

报告

id
id_user
comments

ReportedUser

id
id_report
id_user

我想列出每个报告及其报告的用户,但我不知道如何进行正确的查询。

我使用了内部联接,但它显示了来自ReportedUser表的所有记录,显示两次或更多(取决于报告用户在报告中的报告方式)相同的报告。

我知道我可以在编程语言(PHP)中做到这一点,但我需要使用LIKE运算符来过滤信息等等。是否可以在MySQL中执行此操作?

1 个答案:

答案 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)