我有一个用户表,其中包含一对标识符:id
和type
,如下所示:
id | type | name
----------------
15 | 1 | AAA
16 | 1 | BBB
15 | 2 | CCC
我想得到一个列表,匹配id和类型。
我目前使用的是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')
但是,我觉得这可能会更好,怎样才是正确的方法呢?
谢谢!
发布于 2017-10-20 17:25:06
您可以在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)
)
发布于 2017-10-20 17:31:24
IN
可以对值的“元组”进行操作,比如这个(a, b) IN ((c,d), (e,f), ....)
。使用此方法(应该更快),因为您不对"a“和"b”执行串接操作,然后对字符串进行比较;相反,您正在比较对值、未处理的值和使用适当的比较操作(即,不总是字符串比较)。
此外,如果"a“和/或"b”是字符串值,那么使用concat技术本身可能会导致不明确的结果。("1-2“、"3")和("1”、"2-3")对连接到相同的结果"1-2-3“。
发布于 2017-10-20 17:09:23
你可以把它们分开。不确定它是否更有效,但至少您可以保存部分内容:
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)
https://stackoverflow.com/questions/46853977
复制相似问题