mysql IN运算符以降序返回值

时间:2012-01-05 04:42:13

标签: php mysql sql

我正在尝试使用IN运算符从我的mysql数据库运行查询。

SELECT usernum FROM usergroup WHERE emailmain IN ('blah@blah.com', 'rawr@rawr.com', 'e@e.com')

查询有效,但不是按输入的顺序输出usernum值,而是按降序输出。这是有问题的,因为我需要它们与电子邮件对齐。我认为这可能与limit运算符或使用ORDER BY emailmain有关。我已经尝试过了,但它仍然无效,因为假设数据库中不存在电子邮件,它将不对应于数组中的内存位置。

对我来说最重要的是我知道数据库中没有的电子邮件。

任何帮助将不胜感激!

5 个答案:

答案 0 :(得分:1)

您可以使用ORDER BY FIELD来定义订单

SELECT usernum 
FROM usergroup 
WHERE emailmain IN ('blah@blah.com', 'rawr@rawr.com', 'e@e.com')
ORDER BY FIELD (emailmain, 'blah@blah.com', 'rawr@rawr.com', 'e@e.com')

答案 1 :(得分:1)

IN根本不会影响结果的顺序,如果没有ORDER子句,行将按照找到的顺序返回。

如果您需要将结果的顺序与提供的电子邮件列表的顺序相匹配,请尝试以下操作:

SELECT usernum
  FROM usergroup
  WHERE emailmain IN ('blah@blah.com', 'rawr@rawr.com', 'e@e.com')
  ORDER BY FIND_IN_SET(emailmain, "blah@blah.com,rawr@rawr.com,e@e.com")

FIND_IN_SET将以逗号分隔的列表

返回给定字符串的位置

对于较大的列表,使用SELECT usernum, emailmain FROM ...返回每个结果中的两个字段并将它们与应用程序端相关联可能会更安全。

答案 2 :(得分:1)

如果要动态创建IN字符串,则每次运行查询时都不必创建表 - 您可以使用内联视图,其填充方式与IN字符串相同,如下所示:

select v.email, u.usernum
from 
(select 'blah@blah.com' email union select 'rawr@rawr.com' union select 'e@e.com') v
left join usergroup u on v.email = u.emailmain
order by v.email

答案 3 :(得分:0)

为什么您不只是从数据库中选择用户名和电子邮件?

SELECT usernum, emailmain FROM usergroup WHERE emailmain IN ('blah@blah.com', 'rawr@rawr.com', 'e@e.com') ORDER BY emailmain DESC

答案 4 :(得分:0)

提供IN条件并不意味着订单。

要订购结果,请在查询结束时使用ORDER BY