0

我正在尝试使用 mysql 进行特定排序。这是我的桌子

id      fb_id   ...   date_added
1       1111111111    2013-04-15 14:15:00
2       1111111111    2013-04-15 14:16:00
3       1111111111    2013-04-15 14:17:00
4       2222222222    2013-04-15 14:18:00
5       3333333333    2013-04-15 14:19:00
6       4444444444    2013-04-15 14:20:00
7       2222222222    2013-04-15 14:21:00
8       1111111111    2013-04-15 14:22:00

我期望的是首先按 fb_id 111111111 和 2222222222 排序,然后按最新日期顺序排序,如下所示......

id      fb_id   ...   date_added
1       1111111111    2013-04-15 14:22:00
2       2222222222    2013-04-15 14:21:00
3       2222222222    2013-04-15 14:18:00
4       1111111111    2013-04-15 14:17:00
5       1111111111    2013-04-15 14:16:00
6       1111111111    2013-04-15 14:15:00
7       4444444444    2013-04-15 14:20:00
8       3333333333    2013-04-15 14:19:00

我正在尝试的 SQL:

SELECT `id`, `fb_id`, `date_added` from MyTable
ORDER BY case when fb_id in (1111111111,2222222222) then -1 else date_added end, date_added desc

它首先按 fb_id 排序,但其余数据不按 'date_added desc' 排序?请帮忙..

4

2 回答 2

6

date_added由于您的ELSE子句,您首先按升序排序。尝试:

ORDER BY case when fb_id in (1111111111,2222222222) then 0 else 1 end, 
    date_added desc
于 2013-04-15T07:19:08.827 回答
2

使用基于行的函数的解决方案应该谨慎看待,当你尝试扩大规模时,它们有时会导致问题。

如果您的桌子仍然相对较小,那应该不是问题,但如果您担心,您可以尝试以下操作:

select 1 as seq, id, fb_id, date_added
    where fb_id in (1111111111,2222222222)
union all select 2 as seq, id, fb_id, date_added
    where fb_id not in (1111111111,2222222222)
order by seq, fb_id, date_added desc

这会导致对 DBMS 的两次查询,但这通常比在排序之前必须对结果集的每一行执行额外处理要快。

与所有解决方案一样,您应该衡量影响而不是猜测,并使用具有代表性的数据来​​做。

于 2013-04-15T07:27:29.220 回答