2010-01-19 60 views
1

有了這個表(對不起,不能似乎在這裏得到一個體面的佈局):整蠱SQL SELECT的問題(MySQL的)

PD  Header   Text    Mask_Producer  Mask_Dep  Mask_Diam 
---------------------------------------------------------------------------------------------- 
10  Producer  Aproducer   Aprod    *    * 
10  Producer  Bproducer   Bprod    *    * 
20  Diam   A     Aprod    10    30 
20  Diam   A     Aprod    20    40 
20  Diam   B     Aprod    10    40 
30  Dep   10    Aprod    10    * 
30  Dep   20    Aprod    20    * 
30  Dep   30    Aprod    30    * 
20  Diam   A     Bprod    20    40 
30  Dep   10    Bprod    10    * 

我正在使用的表作爲過濾器/屏蔽該行選擇其他行。

所以,用戶在已經做出了選擇行有:

PD Text 
------------- 
10 Aproducer 
20 A 

我現在想找出什麼行與PD = 30適合那些以前的選擇:

PD = 10,文本= Aproducer給出了Mask_Producer必須是「Aprod」,(Mask_Dep和Mask_Diam被允許爲星星的任何東西)

PD = 20,Text = A給出Mask_Producer必須是「Aprod」並且Mask_Dep必須是10或20和Mask_Diam必須是30或40(或星號)

我希望結果是上表中的第6行和第7行。

然後想象與2000rows和20個Mask_xx領域這個例子....

我想SQL像IN,LEFT JOIN,連接和臨時表要做到這一點,但我想我可能太複雜的東西很多....

+0

使數據代碼(4位),所以在等寬它至少呈現。 – 2010-01-19 22:59:39

+0

感謝您不使用標籤 - 降價語法:http://stackoverflow.com/editing-help – 2010-01-19 23:00:16

+1

我不明白你試圖在你的查詢中捕獲什麼規則。例如,爲什麼第6行和第7行是所需的輸出?我沒有看到這種模式。 – recursive 2010-01-19 23:03:03

回答

0

這是我使用的代碼類型,它的工作原理,但隨着我添加更多的標準和字段,我得到更多的大連接,並且在每個連接中還有更多的AND或OR序列,所以任何改進的命題都是值得歡迎的!特別是,我認爲這可能是緩慢的數據交流?分析sql服務器爲我的代碼做什麼也是受歡迎的!

現在我有大約30個標準/領域和一些PHP代碼,爲​​我生成SQL查詢....

但這裏是爲原則的小例子:

SELECT DISTINCT t30.* 
FROM 
    (SELECT * 
    FROM YourTable 
    WHERE PD = 10 
    AND Text = 'Aproducer') AS t10 
JOIN 
    (SELECT * 
    FROM YourTable 
    WHERE PD = 20 AND Text = 'A') AS t20 ON 
    (t20.MaskProducer = t10.MaskProducer 
           OR t20.MaskProducer = '*' 
           OR t10.MaskProducer = '*') 
    AND (t20.MaskDep = t10.MaskDep 
           OR t20.MaskDep = '*' 
           OR t10.MaskDep = '*') 
    AND(t20.MaskDiam = t10.MaskDiam 
           OR t20.MaskDiam = '*' 
           OR t10.MaskDiam = '*') 
//more JOINS like the one above for each criteria 
// below the final join to get the result from 
JOIN 
    (SELECT * 
    FROM YourTable 
    WHERE PD = 30) AS t30 ON 
     (t30.MaskProducer = t20.MaskProducer 
          OR t30.MaskProducer = '*' 
          OR t20.MaskProducer = '*') 
     AND (t30.MaskDep = t20.MaskDep 
          OR t30.MaskDep = '*' 
          OR t20.MaskDep = '*') 
     AND (t30.MaskDiam = t20.MaskDiam 
          OR t30.MaskDiam = '*' 
          OR t20.MaskDiam = '*'); 
1

我想我明白你在問什麼,但我更熟悉SQL Server,所以如果我的語法稍微偏離請原諒我。你應該能夠做一個內部聯接,將表加入自己以獲得你想要的結果。

SELECT * 
FROM tbData A 
JOIN tbData B ON A.PD = B.Mask_Dep AND A.Mask_Producer=B.Mask_Producer 
WHERE A.PD = 10 
    AND A.Text='Aproducer' 
UNION 
SELECT * 
FROM tbData A 
JOIN tbData B ON A.PD = B.Mask_Dep AND A.Mask_Producer=B.Mask_Producer 
WHERE A.PD = 20 
    AND A.Text='A' 

看着這我覺得我有點偏離,但你的一些數據不清楚。你能否給出你在Mask_Dep和Mask_Diam中尋找的更多通用規則?

+0

嗨,你可能會對某事,但A.PD = B.Mask_Dep顯然是不正確的,這些領域是無關的。 – 2010-01-21 08:49:46

+0

點採取。似乎A.PD和B.PD的規則是不同的。是這樣嗎?如果不是,你能給我一個統一的規則嗎?我想如果你能的話我可以幫你。 – 2010-01-21 14:28:30

+0

找到了解決方法從其他來源(rob_farley): SELECT t30。* FROM(SELECT * FROM YourTable WHERE PD = 10 AND Text ='Aproducer')as t10 JOIN(SELECT * FROM YourTable where PD = 20 AND Text =' A')as t20 ON(t20.MaskProducer = t10.MaskProducer OR t20.MaskProducer ='*'OR t10.MaskProducer ='*')AND(t20.MaskDep = t10.MaskDep OR t20.MaskDep ='*'OR t10 .MaskDep ='*')AND(t20.MaskDiam = t10.MaskDiam OR t20.MaskDiam ='*'OR t10.MaskDiam ='*') ...繼續下一條評論.... – 2010-01-22 06:58:01

1

我想你想是這樣的:

SELECT r.* FROM table AS c -- choices 
JOIN table AS r   -- results 
    ON (
     (r.mas_dep = '*' OR c.mask_dep = r.mask_dep) 
     AND 
     (r.mask_diam = '*' OR c.mask_diam = r.mask_diam) 
    ) 
WHERE (
    (c.pd = 10 AND c.text = 'Aproducer') 
    OR (c.pd = 20 AND c.text = 'A') 
) 
AND r.PD = 30 

這將需要的選擇的結果:

PD  Header   Text   Mask_Producer Mask_Dep Mask_Diam 
10  Producer  Aproducer Aprod   *   * 
20  Diam    A   Aprod   10   30 
20  Diam    A   Aprod   20   40 

和自加入它針對主表,在這些條件保持爲真r.mas_dep = '*' OR c.mask_dep = r.mask_depr.mask_diam = '*' OR c.mask_diam = r.mask_diam。這將返回一組:

PD  Header   Text   Mask_Producer Mask_Dep Mask_Diam 
30  Dep    10   Aprod   10   * 
30  Dep    20   Aprod   20   * 

它會排除其他明確,因爲他們的30 mask_deps是不是在選擇結果集,這將排除行PDS而不是30

+0

這看起來像你打倒我!將思考並嘗試讓你知道。謝謝你,現在睡覺... ;-) – 2010-01-20 00:14:38

+0

嗨,埃文,現在測試,幾乎可以工作! ....如果我添加這些行#9:「20 Diam A Bprod 20 40」和#10:「30 Dep 10 Bprod 10 *」我將在選擇中得到#9(錯誤),然後還包括#10結果(錯誤)....有什麼建議? – 2010-01-21 08:44:33