[英]MySQL: LEFT JOIN table with preference for specific rows
我有一個聯系人表、一個電話號碼表和一個聯系人電話號碼表。 通過 ContactPhoneNumber pivot 表,一個聯系人可以有許多電話號碼。 PhoneNumber 可以標記為主要或不標記。 聯系人也可以沒有主要電話號碼,或者實際上根本沒有電話號碼。
我的問題是我需要檢索所有聯系人,無論他們是否有電話號碼。 此外,對於每個聯系人,如果他們有一個,我需要檢索他們的主要電話號碼。 如果不是,則檢索非主要電話號碼,或者最后不返回任何電話號碼。 加入表格不是問題,但我無法想出一種首選主要電話號碼而不是非主要電話號碼的方法。 因為,如果我在查詢中添加WHERE isPrimary = 1
,它現在將消除那些沒有主要電話號碼的用戶。 相反,我只需要更喜歡 1,但如果不存在 1,也可以使用 0。 到目前為止,我的查詢如下:
SELECT * FROM Contact
LEFT JOIN ContactPhoneNumber ON ContactPhoneNumber.ContactID = Contact.ContactID
LEFT JOIN PhoneNumber ON ContactPhoneNumber.PhoneNumberID = PhoneNumber.PhoneNumberID
GROUP BY Contact.ContactID;
這個問題的SQL Fiddle可以在http://sqlfiddle.com/#!9/92e21e/1找到
您可以使用ROW_NUMBER()
根據重要性對電話號碼進行排序,然后只選擇第一個。
例如:
select *
from (
select
c.*,
n.*,
row_number() over(partition by c.ContactID order by IsPrimary desc) as rn
FROM Contact c
LEFT JOIN ContactPhoneNumber cn ON cn.ContactID = c.ContactID
LEFT JOIN PhoneNumber n ON cn.PhoneNumberID = n.PhoneNumberID
) x
where rn = 1
結果:
ContactID FirstName PhoneNumberID PhoneNumber IsPrimary rn
---------- ---------- -------------- ------------- ---------- --
1 Jim 2 555-727-7277 1 1
2 John 3 444-727-7277 0 1
3 Timothy null null null 1
請參閱DB Fiddle上的運行示例。
SELECT t1.*,
t2.*,
COALESCE(t3.PhoneNumberID, t4.PhoneNumberID) PhoneNumberID,
COALESCE(t3.PhoneNumber, t4.PhoneNumber) PhoneNumber,
COALESCE(t3.IsPrimary, t4.IsPrimary) IsPrimary
FROM Contact t1
LEFT JOIN ContactPhoneNumber t2 ON t1.ContactID = t2.ContactID
LEFT JOIN PhoneNumber t3 ON t2.PhoneNumberID = t3.PhoneNumberID AND t3.IsPrimary
LEFT JOIN PhoneNumber t4 ON t2.PhoneNumberID = t4.PhoneNumberID
GROUP BY t1.ContactID;
https://dbfiddle.uk/?rdbms=mysql_5.6&fiddle=92a31ad5270a5fe83433fb5c12613cdb
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.