2012-01-05 86 views
0

我想用我的mysql数据库使用IN运算符运行一个查询。mysql IN运算符以降序顺序返回值

SELECT usernum FROM usergroup WHERE emailmain IN ('[email protected]', '[email protected]', '[email protected]') 

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

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

任何帮助,将不胜感激!

+1

为什么你会期望他们以任何顺序,如果你不指定一个?这可能有助于使用“EXPLAIN SELECT ...”语法来决定数据库用于返回数据的索引。如果你没有指定一个 - mysql将使用它所决定的最好的索引来回答你的查询 – 2012-01-05 04:50:40

+0

是的,我不知道我在想什么。它的晚了,我没有想到索引。但是,我仍然遇到它不告诉我哪些电子邮件不在数据库中的问题。 – Trent 2012-01-05 05:03:00

+1

这可能是你的问题 - 你正在像我一样思考 - 哪一个是程序员 - 而不是DBA - 99.9999%的所有电子邮件都不在你的数据库中 - 你需要根据你想要的来思考“集合论” - 一个粗略的猜测是“这个电子邮件列表不在我的数据库中”我的建议是创建一个'说'电子邮件的表,然后做一个左连接并检查NULL。 – 2012-01-05 05:06:41

回答

1

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

select v.email, u.usernum 
from 
(select '[email protected]' email union select '[email protected]' union select '[email protected]') v 
left join usergroup u on v.email = u.emailmain 
order by v.email 
+0

我在第一次遇到一些问题但只需将phpmyadmin中的排序规则更改为latin1_swedish_ci即可。我非常感谢帮助。谢谢! – Trent 2012-01-05 17:13:25

1

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

SELECT usernum 
FROM usergroup 
WHERE emailmain IN ('[email protected]', '[email protected]', '[email protected]') 
ORDER BY FIELD (emailmain, '[email protected]', '[email protected]', '[email protected]') 
+0

我试着这但它不会显示不在数据库中的电子邮件。尽管谢谢您的帮助! – Trent 2012-01-05 04:59:34

+0

这并不意味着向您显示数据库中的电子邮件。这只会按照您指定的顺序排列电子邮件。 – JohnP 2012-01-05 05:13:06

+0

这并没有解决问题,但它将来肯定会有用!谢谢! – Trent 2012-01-05 05:14:21

1

IN将根本不影响您的结果的顺序,没有ORDER子句行会回来可以以任意顺序他们发现在

如果您需要匹配的结果,您提供的电子邮件列表的顺序的顺序,试试这个:

SELECT usernum 
    FROM usergroup 
    WHERE emailmain IN ('[email protected]', '[email protected]', '[email protected]') 
    ORDER BY FIND_IN_SET(emailmain, "[email protected],[email protected],[email protected]") 

FIND_IN_SET将返回一个逗号分隔的列表

有了较大的列表,它可能会更安全,虽然只使用SELECT usernum, emailmain FROM ...在每个结果返回这两个领域和应用端关联起来给定字符串的位置。

+1

我不知道[FIELD](http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_field)函数JohnP在处理我的答案时发布了。这可能是一个比FIND_IN_SET更好的选择。 – 2012-01-05 04:57:52

+0

我也没有。它将在未来有所帮助。然而,为什么它的重要性我正确排序的主要原因是为了让我知道哪些电子邮件不在数据库中。执行完后,我使用mysql_fetch_assoc获取值,然后将它们设置为等于一个数组。但是,它不会显示不在数据库中的电子邮件。 – Trent 2012-01-05 05:06:54

+0

也许你想要的是'SELECT usernum FROM usergroup WHERE emailmain NOT IN('[email protected]','[email protected]','[email protected]')' – 2012-01-05 18:46:03

0

提供IN条件并不意味着该命令。

要查询结果,请在查询结尾处使用ORDER BY