mysql - 一张表上的多个 SQL 查询

标签 mysql sql join

我正在使用 LAMP。在 MySql 中,我有一个包含 X、Y 和 Z 列的表。我需要从多个集合和子集中选择不同的记录。如果我的初始标准是 WHERE Y = A;那么我需要能够:

  • 通过选择 Y = A 的记录来获取集合 B,
  • 通过选择 X 位于集合 B 且 Z = 123 的记录来获取集合 C
  • 通过选择 Y 位于集合 B 且 Z = 456 的记录来获取集合 D
  • 通过选择 X 位于集合 D 且 Z = 789 的记录来获取集合 E

表格可能会变得很大,我不太确定从哪里开始。一些可能的方法是:

  1. 有多个单独的查询。在这种情况下,我将如何缓存一个查询的结果集以用作另一个查询的输入?内存缓存?
  2. 使用嵌套子查询。但内层查询的结果纯粹是为了限制外层查询不是吗?我怎样才能让它们出现在结果中?
  3. 使用 UNION。但是我如何存储一个查询的结果以用作另一个查询的输入?
  4. 多次将表连接到自身。这将产生笛卡尔结果,其中外部行重复多次。这将映射到一个应该易于管理的多维 PHP 数组。那么性能呢?

我倾向于选项 4,但不是 100% 确定。我是在重新发明轮子吗?

非常感谢...

最佳答案

我不明白你的目标,因为你没有定义对 X 的限制,但是根据你的描述,我相信集合 E 是空的。我这么说是因为集合 D 已经包含 Z 为 456 的行。因此,当您对该结果集运行另一个查询以针对 Z 为 789 的条件生成 E 时,您将不会得到任何行,因为 D 中的所有行都是 456。

现在谈谈个人看法:

  1. 尽可能避免笛卡尔积 - 连接很好,但要小心,尽可能避免交叉积
  2. 如果需要,对表进行非规范化以提高查询效率
  3. 生成查询,以产生尽可能最小的结果集来满足您的要求
  4. 如果可能,使用子查询来减少结果集大小
  5. 信任查询优化器,因此尽可能避免子查询
  6. 尽可能让 SQL 完成工作,因为它有能力和资源以最优化的方式计算数据

为了突出上面的第 4 项,我想提一下,在 D 的示例中,您可以编写以下查询,而无需子查询或任何其他临时存储:

SELECT * FROM MyTable WHERE Y = A AND Z = 456

现在,也许我可以尝试通过猜测你想要什么来解决你的困境:

SELECT * FROM MyTable WHERE Y = A AND Z IN (123, 456, 789)

或者:

SELECT * FROM MyTable WHERE Y = A AND (Z = 123 OR Z = 456 OR Z = 789)

希望这有帮助

关于mysql - 一张表上的多个 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13906154/

相关文章:

mysql - ios 在离线模式下保存数据

java - 添加列到连接表?

mysql - 在一个查询中显示它所属的每个产品的所有类别

php - Sql 插入为 "insert block"方法

mysql - 如何根据另一个表中最新的结果来选择结果,且不重复?

MySQL AND 与 OR 条件

mySQL - 使用三个表中的数据和列创建新表

mysql - 复杂的删除查询

sql - 我可以避免在这种递归查找场景中使用游标吗?

sql - MySQL获取一个月中每一天的日期的行数