2017-08-08 77 views
1

的行我有如下表:SQL:选择与第一顺序匹配特定的ID和特定类型

id name type 
-- ---- ----- 
1 Joe H 
1 Zoe F 
2 Ken F 
2 Ben H 
3 Lime H 
4 Fine F 
5 Lima F 
5 Sima H 

我想首先选择匹配的行:

id: 5 & type: H 

id: 2 & type: F 

id: 3 & type: H 

并经过他们其余的由ASC订购。

所以最终的结果应该是:

id name type 
-- ---- ----- 
5 Sima H 
2 Ken F 
3 Lime H 
1 Joe H 
1 Zoe F 
2 Ben H 
4 Fine F 
5 Lima F 

我只是找不到如何显示超过一个值排序第一特定行。如果有帮助,我使用PHP和MySqli。

谢谢

+0

这是一个痛苦的在mysql中做,你可能也只是选择所有的行,使用PHP进行操作,因为您无论如何都选择了它们。 – user2914191

+0

你确定在PHP中做更容易吗? 你能给我一个如何做的例子吗? – Ido

回答

1

您可以用case语句命令:

select * from table 
order by 
    case 
     when id = 5 and type = 'H' then 0 
     when id = 2 and type = 'F' then 1 
     when id = 3 and type = 'H' then 2 
     else 3 
    end, id, name 
+0

这是最简单最快速的方法吗? – Ido

+1

@Ido这是我知道的最简单的方式,它是正确的。请小心使用'UNION'来获得特定订单。虽然大多数情况下你会得到正确的结果,但如果外部查询不包含'ORDER BY',它实际上不能保证。请参阅“对单个SELECT语句使用ORDER BY意味着行在最终结果中出现的顺序,因为默认情况下UNION会生成无序的一组行。” https://dev.mysql.com/doc/refman/5.7/en/union.html – FuzzyTree

+0

谢谢!这也是大桌子最快的方式,对吧? – Ido

0

既然你问MySQL,我会给你一个MySQL的答案。

SELECT * FROM 
(SELECT * FROM `table` WHERE id = 5 AND `type` = "H" ORDER BY id ASC) t 
    UNION 
(SELECT * FROM `table` WHERE id = 2 AND `type` = "F" ORDER BY id ASC) 
    UNION 
(SELECT * FROM `table` WHERE id = 3 AND `type` = "H" ORDER BY id ASC) 
    UNION 
(SELECT * FROM `table` ORDER BY id ASC); 

结果

+------+------+------+ 
| id | name | type | 
+------+------+------+ 
| 5 | Sima | H | 
| 2 | Ken | F | 
| 3 | Lime | H | 
| 1 | Joe | H | 
| 1 | Zoe | F | 
| 2 | Ben | H | 
| 4 | Fine | F | 
| 5 | Lima | F | 
+------+------+------+ 
8 rows in set (0.00 sec) 
+0

它不是显着慢于FuzzyTree的答案,因为它每次搜索整个表? – Ido

+0

是的。它不会每次搜索整个表,如果你有一个id和类型的索引。速度没有被指定为一个问题。我认为这是一个小的数据集,这就是为什么我建议首先使用PHP。如果你有一张巨大的桌子,那么你的查询会吃掉你的记忆。 – user2914191