MySQL中的多个混合值行与子查询比较

时间:2011-07-05 12:36:16

标签: mysql sql database

我为这个令人困惑的头衔道歉。我想知道的是:我有一个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文档无济于事(可能是因为我不知道如何很好地解决问题)。

提前感谢您的时间和帮助。

4 个答案:

答案 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的原因。以上关注的是性能(“感觉很慢”)。感觉?