2015-07-03 30 views
0

我的表設置如此。選擇與不同值相匹配的行來檢索公共字段

id plan_id name rule 
1  3 dep 4 
2  3 sta 3 
5  4 pri 7 
6  1 dep 4 

可讀的傳說; dep =部門,sta =狀態,pri =優先

想法是我想檢索符合指定條件的'plan_id'。我試過了許多我認爲可行的查詢。這是最接近的。我試圖找出如何最好地構建查詢。雖然我想知道是否有更好的方法來編寫此查詢。在某些情況下,只有部門可能需要匹配。在其他情況下,我可能需要匹配所有三個或兩個。

在這種情況下,我想找到包含狀態和部門的計劃。我需要它匹配狀態== 3和部門== 4.下面的代碼應該爲plan_id返回'3'。

SELECT o.plan_id AS s_id 
FROM `plan_criteria` o 
LEFT JOIN plan_criteria pc 
ON pc.plan_id=o.plan_id 
WHERE (o.name IN ('sta') AND o.rule_match=3) 
AND (pc.name IN ('dep') AND pc.rule_match=4) 

編輯 -

一個計劃也可以包含多個部門/狀態/優先級。

回答

0

您不需要執行連接,只需使用適當的where子句執行「select distinct plan_id ...」。我也會重新審視你的邏輯。您的意思是:

((pc.rule = 3 AND pc.rule = 4)OR(pc.name ='sta'AND pc.name ='dep'));

在這種情況下,你會最終有一個結果集的3和1

還有一個編輯:-)尋找更仔細,如果「名稱」列確實包含值「部門」,「狀態「和」優先級「,您可能需要重新設計以列爲單位的表格。像這樣的查詢確實不應該是一個大問題,你只需要對錶格進行佈局。

+0

我做了一個編輯。例如;我想找到包含狀態和部門的計劃。我需要它匹配狀態== 3和部門== 4.因此,(name ='sta'AND rule ='3')AND(name ='dep'AND rule ='4') – tywsge

0
SELECT o_plan_id 
FROM `plan_criteria` 
WHERE `o_name` = "sta" 
    AND `rule_match` = "3" 
    AND `pc_name` = 'dep' 
    AND `pc_rule_match` = '4' 

我會一起使用o_和pc_來簡化表格。只要你的桌子不要太瘋狂

相關問題