始终显示联接的左侧,仅在任何符号和子句匹配时显示右侧

时间:2017-08-30 17:22:09

标签: mysql join

我有3个表,一个client表,一个user表和一个user_has_client表。

user_has_client表可以加入其他2个表,但它也有一个roles列。

MariaDB [extrapack]> desc user;
+----------------+----------------------+------+-----+---------+----------------+
| Field          | Type                 | Null | Key | Default | Extra          |
+----------------+----------------------+------+-----+---------+----------------+
| user_id        | int(10) unsigned     | NO   | PRI | NULL    | auto_increment |
| email          | varchar(255)         | NO   | UNI | NULL    |                |

MariaDB [extrapack]> desc client;
+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| client_id   | int(10) unsigned | NO   | PRI | NULL    | auto_increment |

MariaDB [extrapack]> desc user_has_client;
+-----------+------------------+------+-----+---------+-------+
| Field     | Type             | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| user_id   | int(10) unsigned | NO   | PRI | NULL    |       |
| client_id | int(10) unsigned | NO   | PRI | NULL    |       |
| roles     | tinytext         | YES  |     | NULL    |       |
+-----------+------------------+------+-----+---------+-------+

rolesclient可能有多个不同的user,而roles列是一个数组。

MariaDB [extrapack]> select * from user_has_client where roles != "" limit 3;
+---------+-----------+---------+
| user_id | client_id | roles   |
+---------+-----------+---------+
|     181 |       395 | cpa, ce |
|     181 |       473 | cpa     |
|     181 |       498 | cpa     |
+---------+-----------+---------+

但是一个客户端只能为一个用户提供一个相同的角色。例如,在同一个客户端上不能有两个不同的用户具有cpa角色。

我想列出一个客户端,并且对于客户端,如果有这样的用户,则仅列出具有角色cpa的一个用户。

以下是我的发言:

SELECT c.client_id AS client_id0, ou.user_id AS user_id3, ou.email AS email5 FROM client c LEFT JOIN user_has_client ouhc ON c.client_id = ouhc.client_id LEFT JOIN user ou ON ouhc.user_id = ou.user_id AND ouhc.roles LIKE '%cpa%' WHERE c.client_id = 265 ORDER BY ou.email DESC;

clientuser可能有也可能没有加入记录,但即便如此,我仍然希望显示client的列表行,所以我不能做一个内连接,必须做左连接。

但是在进行左连接时,我仍然希望每个客户端只有一个列表行。

截至目前,上述语句为客户提供了n行,因为n用户在此客户端上有加入。但是,这些n用户中只有一个在其加入中具有cpa角色。所以我想只显示一个列表行,并且只显示该用户。

所以,总而言之,我总是希望每个客户端只有一行,并且只有一行,并且对于给定角色的用户,如果该客户端有cpa角色,则说明。

1 个答案:

答案 0 :(得分:2)

我可能会稍微改变你的计划。使user_has_client.roles每行只携带一个角色。然后,如果您只想为每个客户端允许一个角色,请在user_idrole上设置UNIQUE约束。