2017-08-30 62 views
0

我有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用于clientuser,并且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

从问题来看,如果唯一索引是在用户标识 - 角色字段还是客户端标识 - 角色组合中,则不完全清楚。 '但是一个客户只能为一个用户提供同一个角色。例如,在两个不同的客户端上不能有一个具有cpa角色的相同用户。“引用的句子不清楚,该示例不适用于引用的第一句。 – Shadow

+0

引述的第二句确实是错误的。我的错。我会在问题中纠正它。它应该是:“例如,在同一个客户端上不能有两个具有cpa角色的不同用户。” – Stephane

+0

为了更好地关注实际问题,我重新提出了问题标题。 – Stephane

回答

2

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

+0

我不能只有一个角色,而不是一个角色数组。这些角色的独特性对我的问题没有副作用。即使角色列中只包含一个角色,问题依然存在。我会使用'='而不是'like',但这不会改变我所选择的语句问题。我认为。 – Stephane

+1

@Stephane丹尼尔并没有建议你为每个用户设置一个角色。他建议 - 非常正确 - 每个用户 - 客户 - 角色安排应该存储在自己的记录中。通过这种方式,您可以通过一个唯一的密钥强制执行您描述的唯一性。 – Shadow

+0

每行只携带一个角色会产生更多的连接记录。它可以更清洁,因为更明确。但是我在一个传统架构上,并且无法触及太多。将所有角色都放在一列中,避免干扰现有代码。无论如何,我的问题并不是强制执行唯一性。如果你拿走多角色方面,只考虑'cpa'的一个可能的角色,我的问题依然存在。 – Stephane

相关问题