我有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
角色(如果该客户端有任何角色)。
从问题来看,如果唯一索引是在用户标识 - 角色字段还是客户端标识 - 角色组合中,则不完全清楚。 '但是一个客户只能为一个用户提供同一个角色。例如,在两个不同的客户端上不能有一个具有cpa角色的相同用户。“引用的句子不清楚,该示例不适用于引用的第一句。 – Shadow
引述的第二句确实是错误的。我的错。我会在问题中纠正它。它应该是:“例如,在同一个客户端上不能有两个具有cpa角色的不同用户。” – Stephane
为了更好地关注实际问题,我重新提出了问题标题。 – Stephane