我有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 | |
+-----------+------------------+------+-----+---------+-------+
roles
和client
可能有多个不同的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;
client
和user
可能有也可能没有加入记录,但即便如此,我仍然希望显示client
的列表行,所以我不能做一个内连接,必须做左连接。
但是在进行左连接时,我仍然希望每个客户端只有一个列表行。
截至目前,上述语句为客户提供了n
行,因为n
用户在此客户端上有加入。但是,这些n
用户中只有一个在其加入中具有cpa
角色。所以我想只显示一个列表行,并且只显示该用户。
所以,总而言之,我总是希望每个客户端只有一行,并且只有一行,并且对于给定角色的用户,如果该客户端有cpa
角色,则说明。
答案 0 :(得分:2)
我可能会稍微改变你的计划。使user_has_client.roles
每行只携带一个角色。然后,如果您只想为每个客户端允许一个角色,请在user_id
和role
上设置UNIQUE约束。