我有一个用户表,其中有一对作为标识符:id
和type
,如下所示:
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')
但是,我觉得它可能会更好,这样做的正确方法是什么?
谢谢!
答案 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工具库添加)