2013-04-30 126 views
0

想象一下如下表:MySQL的:合併行,返回默認值

id | variant | name 
----------------------- 
1 | 1  | a 
1 | 2  | b 
1 | 3  | c 
2 | 1  | d 
2 | 2  | e 
2 | 3  | NULL 
3 | 1  | g 

哪條SQL語句來完成我需要運行得到這個:

  • 對於給定的ID和指定變體得到這個組合的名字。
  • 但是,如果名稱爲NULL,請獲取具有給定ID但具有變體1的行的名稱(變體1的名稱永遠不會爲NULL)。
  • 如果沒有給定變體的行,請再次使用變量爲1的行使用相同的ID。
  • 變體1從不直接請求。

這就像倒退機制。或者也可以把它看作與變體覆蓋的行的值= 1。

實例:

  • ID = 1,變體= 2:乙
  • ID = 1,變體= 3:C
  • ID = 2,變體= 3:d
  • ID = 3,變體= 5:克

這是可能的SQL?如果該機制應用於更多領域,它表現不錯嗎?

謝謝!

更新:

請注意,我想不僅對name字段這種機制。應該有更多的列應該有相同的行爲 - 但每個列應該自己處理。

+0

我認爲你需要添加一個多列的例子來獲得性能位的好答案。如果你的意思是應該對每個列自己進行處理,就像從變量x中獲得的一樣,如果該列的值爲空,我的回答只是額外的COALESCE,但是這可能是一個糟糕的假設。 – 2013-04-30 14:34:53

回答

2

這應該做你需要使用LEFT JOIN得到什麼可選的值。

SELECT COALESCE(b.Name,a.Name) 
FROM Table1 a 
LEFT JOIN Table1 b 
    ON a.id=b.id AND [email protected] 
WHERE [email protected] AND a.variant=1 

An SQLFiddle to test with

性能方面,這取決於您如何應用查詢來獲取多個字段。如果您可以使用來自現有連接的COALESCE解決您的列選擇問題,那麼我看不到一個大問題,但如果最終有多個自連接來解決問題,則可能有問題。

+1

是的,這是解決方案!我已經與COALESCE一起嘗試過了,但已經獲得了不止一行。但你的解決方案是正確的。還有更多的專欄。非常感謝您的快速響應! – robsch 2013-04-30 14:41:12

0

一如既往,性能將取決於您的數據結構,您擁有的行數以及您創建的索引。我會建議這樣的查詢:

SELECT name FROM table WHERE [email protected] AND (([email protected] AND name IS NOT NULL) OR variant=1) ORDER BY variant DESC LIMIT 1 
+0

不幸的是,這個解決方案不適用於更多的數據列。約阿希姆斯的解決方案似乎是完美的。但是謝謝你的幫助。 – robsch 2013-04-30 14:38:52

+0

如果你做得對,它肯定可以處理更多的數據列。但它一次不能用於多條記錄。很高興你有你需要的。 – 2013-04-30 16:05:23