使用多个条件进行SQL排序

时间:2013-12-21 17:00:20

标签: mysql 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集中的一个,两个或没有字段的项目。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;