2012-12-16 139 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) 

希望這有助於