2017-08-30 22 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

相關問題