带有IN子句的MySQL请求,带有成对标识符的数组

时间:2017-10-20 17:04:13

标签: mysql sql

我有一个用户表,其中有一对作为标识符:idtype,如下所示:

id | type | name
----------------
15 | 1    | AAA
16 | 1    | BBB
15 | 2    | CCC

我想获得一个列表,匹配id和type。

我目前使用的是concat系统:

SELECT u.id,
    u.type,
    u.name
FROM user u
WHERE CONCAT(u.id, '-', u.type) IN ('15-1', '16-1', '17-1', '10-2', '15-2')

但是,我觉得它可能会更好,这样做的正确方法是什么?

谢谢!

4 个答案:

答案 0 :(得分:3)

您可以在mysql中使用以下方法

with dat as 
(
 select 17 id, 1 type, 'AAA' t
 union all
 select 16 id, 1 type, 'BBB' t
 union all
 select 17 id, 2 type, 'CCC' t
)
-- end of testing data 
select *
from dat
where (id, type) in (
 -- query data
  (17, 1), (16, 1)
)

答案 1 :(得分:1)

IN可以对值的“元组”进行操作,例如(a, b) IN ((c,d), (e,f), ....)。使用此方法(应该)更快,因为您没有对“a”和“b”执行concat操作,然后比较字符串;相反,您正在比较未处理的值对和适当的比较操作(即并不总是字符串比较)。

此外,如果“a”和/或“b”是使用concat技术的字符串值本身存在模糊结果的风险。 (“1-2”,“3”)和(“1”,“2-3”)对结果相同“1-2-3”

答案 2 :(得分:0)

您可以将它们分开。不确定它是否更有效但至少你会保存concat部分:

SELECT u.id,
    u.type,
    u.name
FROM user u
WHERE (u.id = 15 AND u.type = 1) 
OR (u.id = 16 AND u.type = 1) 
OR (u.id = 17 AND u.type = 1) 
OR (u.id = 10 AND u.type = 2) 
OR (u.id = 15 AND u.type = 2)

答案 3 :(得分:0)

我认为这取决于你如何获得用于过滤的id和类型的值

如果它们是另一个计算的结果,则可以将它们保存在临时表中并用于连接

create TEMPORARY TABLE criteria as 

select 15 as id, 1 as type
UNION
select 16 as id, 1 as type
UNION
select 17 as id, 1 as type
UNION
select 10 as id, 2 as type
UNION
select 15 as id, 2 as type

  SELECT u.id,
    u.type,
    u.name
FROM user u
  inner join criteria c on u.type = c.type and u.id = c.id

另一个选项是一个内部查询,然后是一个join或一个WITH子句(这是一个相当晚的Mysql工具库添加)