2012-12-16 116 views
0

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

  • 获取集合B通过选择其中Y = A,
  • 获取由选择记录其中X是集合B和Z = 123
  • 获取设置d集C的记录通过选择记录,其中Y是集合B和Z = 456
  • 选择的记录,其中X是一套d和Z获取一组E = 789

表可以得到相当大的,我真的不确定从哪里开始。一些可能的方法是:

  1. 有多个单独的查询。在这种情况下,我将如何缓存来自一个查询的结果集以用作另一个查询的输入? Memcached的?
  2. 使用嵌套子查询。但内部查询的结果纯粹是为了限制外部查询,不是吗?我如何让他们出现在结果中?
  3. 使用UNION。但是,如何将一个查询的结果存储为另一个查询的输入?
  4. 多次将表加入本身。这会在外部行重复多次时产生笛卡尔结果。这将映射到一个应该可以管理的多维PHP数组。虽然表现如何?

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

非常感谢......

+0

你实际需要的中间套(B,C,和d),或者你只关心集E? –

+0

嗨Ripta,是的,我确实需要中间套装。 –

回答

1

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

我们个人的意见:

  1. 避免尽可能笛卡尔产品 - 连接是好的,但要小心,避免交叉产品如果可能的话
  2. 如果需要非规范化表以提高查询效率
  3. 生成的查询产生可能的最小结果集以满足您的要求
  4. 如果可能的话使用子查询来减小结果集的大小
  5. 信任查询优化[R所以要避免的子查询,如果可能的
  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) 

希望这有助于