gpt4 book ai didi

mysql - 始终显示连接的左侧,仅在存在且与子句匹配时显示右侧

转载 作者:行者123 更新时间:2023-11-29 06:55:07 24 4
gpt4 key购买 nike

我有 3 张 table ,一个 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角色(如果该客户有的话)。

最佳答案

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

关于mysql - 始终显示连接的左侧,仅在存在且与子句匹配时显示右侧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45966346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com