mysql - MySQL 查询出现问题

标签 mysql

我在制定查询时遇到了一些麻烦,想知道是否有人可以提供帮助。我在这里将表格信息简化到最低限度,以尝试使其易于理解我想要做什么。 我有两个表 A 和 B。A 有一个 BId 列和一个 Value 字段。 B 有与问题无关的信息。 我想要做的是基于包含 BId 并匹配某个值的 A 的存在的任意 bool 逻辑返回一组 B。另外,我想返回匹配的值。下面是我在查询中想要的几乎有效的示例:

SELECT * FROM B
    WHERE 
    (
         (
         EXISTS (
             SELECT a1.Value FROM A as a1 WHERE a1.BId = B.Id AND a1.Value = "X"
         ) 
         AND EXISTS (
             SELECT a2.Value FROM A as a2 WHERE a2.BId = B.Id AND a2.Value = "Y"
         )
         )
         OR EXISTS (
             SELECT a3.Value FROM A as a3 WHERE a3.BId = B.Id AND a3.Value = "Z"
         )
);

这正是我想要的 B 返回的结果,但是我需要能够返回匹配的值。因此,如果有一个 A 的值为 X,另一个 A 的值为 Y,我希望 a1 和 a2 的值 X 和 Y 包含在该行中。如果不存在值为 Z 的 A,则该行中将返回 NULL。我不确定执行此操作的语法或可能性。 我尝试的另一种方法是使用 JOIN:

SELECT *, a1.Value, a2.Value FROM B 
    INNER JOIN A AS a1 ON a1.BId = B.Id
    INNER JOIN A AS a2 on a2.BId = B.Id
WHERE 
(
  (
     a1.Value = "X" AND a2.Value = "Y"
  )
  OR 
  (
     a1.Value = "Z"
  )
);

这会正确返回值,但仅当 X 和 Y 匹配时才有效。如果 Z 匹配,因为有两个 JOIN 语句来完成第一部分,所以我会得到重复的结果。由于这个原因,我对使用这种方法持怀疑态度。这样使用JOIN似乎不太合适。 如果有人能理解我想要做什么并指出我正确的方向,我将不胜感激。谢谢!

最佳答案

您可能已经知道这一点,但无论如何我都会指出这一点:正如您所说,您的初始 SQL 查询有效,但是您需要能够返回匹配的值。对于如何实现这一点没有通用的答案,因为这不是查询的工作方式。 WHERE EXISTS (SELECT...) 语法不会匹配任何行,如果可以找到一个或多个匹配行,它将返回 TRUE。含义:您的数据库可能有也可能没有行匹配。

如果我查看数据库设计,您的表A似乎有一个外键BId指向B中的记录,并且您没有提及任何唯一键,因此很可能有多个行至少对于某些值符合您的条件。

如果您尝试使用 JOIN 实现相同的目的,则首先必须确保仅获得与 B 中的行数一样多的结果。 (在我的示例中为 10 个结果)。通常这是通过使用 GROUP BY 子句来实现的。我还将语法更改为 LEFT JOIN,以便分组结果将在 B 中为每条记录返回一行:

SELECT B.Id, MIN(a1.ID) AS MinA1, MIN(a2.ID) AS MinA2, MIN(a3.ID) as MinA3 FROM B
LEFT JOIN A AS a1 ON a1.BId = B.Id AND a1.value='X'
LEFT JOIN A AS a2 on a2.BId = B.Id AND a2.value='Y'
LEFT JOIN A AS a3 ON a3.BId = B.Id AND a3.value='Z'
GROUP BY B.Id

现在最后一部分是添加一个条件,消除那些与您的条件不匹配的结果,这将是:

HAVING (MinA1 IS NOT NULL AND MinA2 IS NOT NULL) OR (MinA3) IS NOT NULL

上面假设您的表 A 有一个您想要检索的 Id 列,并且您想要最低的 Id(如果超过)一行匹配。

关于mysql - MySQL 查询出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15819530/

相关文章:

mysql - 使用索引优化 MySQL 查询(什么索引?)

java - 键 'PRIMARY' 的重复实体

mysql - 如何拒绝对单个 MySQL 表的 SELECT 权限?

mysql - TiDB 的 set[sync-log=false] 有什么区别和影响

mysql - SQL ORDER BY by 内部 ORDER BY

MySQL:GRANT 影响了 0 行是错误还是设计使然?

php - 如何将产品添加到购物车然后注册或登录

php - PDO 是否处理 sql 函数?

php - Drupal 到 zen cart sql 查询转换

python - Django ORM 对于非空列返回 None