一个表上有多个SQL查询

时间:2012-12-16 22:34:44

标签: 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. 有多个单独的查询。在这种情况下,如何从一个查询缓存结果集以用作另一个查询的输入? memcached的?
  2. 使用嵌套子查询。但内部查询的结果纯粹是为了限制外部查询,不是吗?如何让它们出现在结果中?
  3. 使用UNION。但是,如何将一个查询的结果存储为另一个查询的输入?
  4. 多次将表格连接到自身。这将产生笛卡尔结果,其中外部行重复多次。这将映射到一个应该易于管理的多维PHP数组。虽然性能怎么样?
  5. 我倾向于选项4,但不是100%肯定。我重新发明了轮子吗?

    非常感谢...

1 个答案:

答案 0 :(得分:1)

我不理解你的目标,因为你没有对X进行限制,但是根据你的描述,我认为集合E是空的。我这样说是因为集合D已经包含Z为456的行。所以当你对该结果集运行另一个查询以生成Z为789的条件时,你不会得到任何行,因为D中的所有行都是456。

现在个人意见:

  1. 尽可能避免笛卡尔产品 - 连接良好但要小心,尽可能避免交叉产品
  2. 如果需要非规范化表以提高查询效率
  3. 生成可以满足您要求的最小结果集的查询
  4. 如果可能,请使用子查询来减少结果集大小
  5. 信任查询优化器,以便尽可能避免使用子查询
  6. 让SQL尽可能地完成工作,因为它具有以最佳方式计算数据的能力和资源
  7. 为了突出显示上面的第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)
    

    希望这有帮助