Mysql 具有多个条件的SQL排序

Mysql 具有多个条件的SQL排序,mysql,sql,Mysql,Sql,我有两张桌子 表1: 表2: item_id是tab1中的外键 如何根据两个表中的条件从Tab1中获得一个ID表。标准如下: 按标题订购ASC。如果标题相同 按值排序DESC。如果标题和值都相同 对“url”键包含“123.com”的项目进行优先级排序 具有有序结果的结果表如下所示: +------------+ | id | title | +------------+ | 4 | A | | 5 | A | | 3 | A | | 6 | A

我有两张桌子

表1:

表2:

  • 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中的一个、两个或任何字段的项。

有点复杂,因为当您执行
联接时,您将得到多行。下面是一种在执行联接之前聚合
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;

据我所知,一个简单的连接就可以了。您必须加入
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

.

你没有给我时间回答:)+1你认为这比约阿希姆·艾萨克森的回答快吗?@c10b10。这取决于许多因素。但是,总的来说,MySQL的连接性能比聚合性能更好。你知道如何让它包含在结果中吗?即使是tab1中没有设置“item\u key”=“value”或在tab2中没有设置“item\u key”=“url”的项也可以,但是,如果缺少一行,您所需的排序顺序并不能告诉您将它们放在什么顺序中。这很好,因为这些项目只剩下最后一行。非常感谢。
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;
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