我为这个令人困惑的头衔道歉。我想知道的是:我有一个SELECT
查询,在WHERE
条件下执行与子查询返回的结果集的多列IN
比较。我希望与该子查询的结果进行比较的是两组可能的值,每组值包含父SELECT
查询中的一个值和一些常量。
换句话说,我怎样才能做出像这样的工作:
SELECT ... WHERE ((id, 1, 2, 3), (id, 4, 5, 6)) IN (SELECT a, b, c, d FROM atable)
在这种情况下,'id'由父SELECT
语句提供,但其他值是常量。目的是将这两组值与'atable'中的多组不同值(a,b,c和d)进行比较。
我知道我可以通过添加OR并重复IN
比较来分别对子查询结果比较两个可能的集合来完成这项工作,但我不想为了效率而这样做(因为它会重复子查询。)
如果这个请求的措辞不是很优雅,我很抱歉,但我希望这个含义能够实现。我试过搜索谷歌并阅读MySQL文档无济于事(可能是因为我不知道如何很好地解决问题)。
提前感谢您的时间和帮助。
答案 0 :(得分:3)
这仍然感觉相当慢。使用连接会不会更有意义?
select query.* from query
inner join atable on (atable.a=query.id) and ((b=1 and c=2 and d=3) or (b=4 and c=5 and d=6)
这仍然是可读的,速度非常快。请注意加入的额外条件。
答案 1 :(得分:1)
根据您的实际情况,以下重新考虑因素是否符合您的需求?
SELECT
*
FROM
query
WHERE
EXISTS (
SELECT
*
FROM
atable
WHERE
a = query.id
AND (
(b = 1 AND c = 2 AND d = 3)
OR
(b = 4 AND c = 5 AND d = 6)
)
)
或者可能......
SELECT
*
FROM
query
INNER JOIN
(
SELECT atable.a FROM atable
WHERE (b = 1 AND c = 2 AND d = 3) OR (b = 4 AND c = 5 AND d = 6)
GROUP BY atable.a
)
AS filter
ON filter.a = query.id
一种广义的意义......
SELECT
*
FROM
query
INNER JOIN
(
SELECT
atable.a
FROM
atable
INNER JOIN
(
SELECT 1 AS b, 2 AS c, 3 AS d
UNION ALL
SELECT 4 AS b, 5 AS c, 6 AS d
)
AS patterns
ON patterns.b = atable.b
AND patterns.c = atable.c
AND patterns.d = atable.d
GROUP BY
atable.a
)
AS filter
ON filter.a = query.id
答案 2 :(得分:0)
SELECT ...
WHERE EXISTS
( SELECT *
FROM
( SELECT a, b, c, d FROM atable
) AS tmp
WHERE (id, 1, 2, 3) = (a, b, c, d)
OR (id, 4, 5, 6) = (a, b, c, d)
)
或Eljakim建议的JOIN
,略有改变。您可能需要GROUP BY
来删除重复的结果:
SELECT ...
JOIN
( SELECT a, b, c, d FROM atable
) AS tmp
ON (id, 1, 2, 3) = (a, b, c, d)
OR (id, 4, 5, 6) = (a, b, c, d)
GROUP BY id
答案 3 :(得分:0)
你也可以联合几个不同的查询。有时,优化器将优化两个更简单查询的UNION,而不是单个更复杂的查询。不应该那样,但通常是。
P.S。我很高兴知道downvote的原因。以上关注的是性能(“感觉很慢”)。感觉?