2013-12-21 90 views
2

我有兩個表。SQL排序與多個標準

TAB1:

+------------+ 
| id | title | 
+------------+ 
| 1 | B  | 
| 2 | C  | 
| 3 | A  | 
| 4 | A  | 
| 5 | A  | 
| 6 | A  | 
| ...  | 
+------------+ 

TAB2:

+-------------------------------------------+ 
| id | item_id | item_key |  item_value | 
+-------------------------------------------+ 
| 1 | 1  | value | $4    | 
| 2 | 1  | url  | http://h.com/ | 
| 3 | 2  | value | $5    | 
| 4 | 3  | url  | http://i.com/ | 
| 5 | 3  | value | $1    | 
| 6 | 3  | url  | http://y.com/ | 
| 7 | 4  | value | $2    | 
| 8 | 4  | url  | http://z.com/ | 
| 9 | 5  | value | $1    | 
| 10 | 5  | url  | http://123.com/ | 
| ...          | 
+-------------------------------------------+ 
  • ITEM_ID是從TAB1的外鍵。

我該如何做到這一點,所以我根據兩個表中的條件按順序從Tab1中獲取ID表。標準如下:

  • 按標題訂購ASC。如果標題相同,則按價值排序DESC
  • 。如果標題和值都相同,
  • 優先考慮'url'鍵包含'123.com'的項目。

與所訂購的結果生成的表是:

+------------+ 
| id | title | 
+------------+ 
| 4 | A  | 
| 5 | A  | 
| 3 | A  | 
| 6 | A  | 
| 1 | B  | 
| 2 | C  | 
| ...  | 
+------------+ 

結果應當包括那些沒有一個項目,這兩者或沒有從TAB2組字段。

回答

3

據我理解,一個簡單的加入將做到這一點。您必須加入Tab2兩次,因爲您要按來自兩行的值排序。

SELECT Tab1.id, Tab1.title 
FROM Tab1 
JOIN Tab2 t2_val ON t2_val.item_id = Tab1.id AND t2_val.item_key='value' 
JOIN Tab2 t2_url ON t2_url.item_id = Tab1.id AND t2_url.item_key='url' 
ORDER BY title, 
     t2_val.item_value DESC, 
     t2_url.item_value LIKE '%123.com%' DESC 

An SQLfiddle to test with

+0

任何想法如何使它在結果中包含tab1中沒有'item_key'='value'或沒有'item_key'='url'設置在tab2中的項目? – c10b10

+0

@ c10b10是的,普通[用'LEFT JOIN'替換'JOIN'](http://sqlfiddle.com/#!2/8c223/1)應該這樣做,但是你想要的排序順序並不能說明按照什麼順序如果缺少一行,請將它們放入。 –

+0

這很棒,因爲那些東西只剩下最後一個。謝謝! – c10b10

2

有點複雜,因爲當你做join你會得到多行。這裏是做加盟前聚集tab2的方法:

select t1.* 
from Tab1 t1 left outer join 
    (select id, 
      max(case when item_key = 'value' then item_value end) as value, 
      max(case when item_key = 'url' then item_value end) as url 
     from Tab2 t2 
     group by id 
    ) t2 
    on t1.id = t2.id 
order by t1.title, t2.value desc, 
     (t2.url like '%123.com%') desc; 
+0

你沒有時間回答:) +1 –

+0

你相信這比Joachim Isaksson的回答快嗎? – c10b10

+0

@ c10b10。 。 。這取決於許多因素。但是,一般來說,MySQL比聚合更好地執行連接。 –