簡體   English   中英

MySQL:LEFT JOIN 表優先於特定行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM