匹配SQL WHERE IN CLAUSE生成的结果

时间:2015-11-13 20:18:49

标签: mysql sql join

让我们看一下这样的简单table

name    id
tom     1
jerry   2
...     ...

从外面,我得到一个包含名字的名单(tom,jerry,kettie ......)

我正在尝试使用WHERE IN子句根据名称列表检索id。

我能做到

SELECT id FROM mySimpleTable where name in ('tom','jerry','kettie');

所以只需迭代name list并在括号中生成内容。

这样可行,但结果不在输入顺序中,例如,输入为tom, jerry, kettie,预期结果为1,2,3,但输出实际上可以是任何顺序。

然后我如何修改SQL clause以确保我的输入和输出匹配,以便我可以相应地执行以下过程。我听说JOIN在这种情况下可能有帮助。

6 个答案:

答案 0 :(得分:3)

SELECT id 
FROM mySimpleTable 
where name in ('tom','jerry','kettie')
order by field(name, 'tom','jerry','kettie')

答案 1 :(得分:1)

  

我听说JOIN在这种情况下可能会有所帮助。

是的,它可以提供帮助:

SELECT m.id 
FROM mySimpleTable m
JOIN (
  SELECT 'tom' AS name, 1 AS orderNum
  UNION ALL
  SELECT 'jerry' AS name, 2 AS orderNum
  UNION ALL
  SELECT 'kettie' AS name, 3 AS orderNum
) AS sub
ON m.name = sub.name
ORDER BY sub.orderNum ASC;

SqlFiddleDemo

此解决方案也可用于不同的RDBMS。 field具体为MySQL

工作原理:

  1. 使用您需要检查和排序列
  2. 的值创建派生表/子查询
  3. JOIN将仅返回基于名称
  4. 的彼此对应的行 您已在子查询中添加的
  5. ORDER BY

答案 2 :(得分:1)

只是select id,name from table_a where name in ('tom','jerry','happy'),您将拥有输入名称和输出ID的组合。

答案 3 :(得分:0)

这完全取决于您获取“in”子句列表的位置。

如果它来自外部的某个地方,您可能应首先将列表转换为临时表,添加一个指示顺序的id列(请参阅this回答以了解如何执行此操作) - 以及然后用它做一个内部联接。

答案 4 :(得分:0)

我确实尝试运行你的SQL查询,而我确实以与输入相同的顺序获得了结果输出。好吧,但仍然没有必要每次都以相同的方式发生,因此在特定层次结构中排列输出的最佳方法是使用ORDER BY子句。语法如下:

SELECT column_name
FROM table_name
WHERE conditions
ORDER BY column_name;

因此,在您的情况下,查询将显示为:

SELECT id
FROM mysimpletable
WHERE name
IN('tom','jerry','kettie'....)
ORDER BY id;

您可以get more help with MySQL concepts在此处获取更多信息。

答案 5 :(得分:-2)

选择 ID 来自mySimpleTable 其中的名字(' tom',' jerry',' kettie') 按ID排序