2015-10-01 46 views
2

我有我的MySQL數據庫的一些表:MySQL查詢 - 從兩個記錄中選擇設置

實驗室檢查(dw_test):

testID  int 
testText varchar 
testGroup int 
testOrder int 
testActive int 
testCalc int 
... 

測試組(dw_group):

groupID int 
groupText varchar 
groupOrder int 
... 

提交給實驗室的測試列表(dw_sub):

subID int 
subTest int 
subForm int 
subSpec int 
... 

如何選擇測試:要麼出現在dw_sub中,要麼出現testCalc爲1的測試?無論哪種情況,testActive必須爲1,subSpec = 100。

該查詢選擇我想要的東西,但留下的是有testCalc = 1的所有測試:

SELECT dw_test.testID, dw_group.groupText, dw_test.testText 
FROM (dw_test LEFT JOIN dw_group ON dw_test.testGroup = dw_group.groupID) RIGHT JOIN dw_sub ON dw_test.testID = dw_sub.subTest 
WHERE ((dw_test.testActive=1) AND (dw_sub.subSpec=100) AND (dw_test.testSite=4)) 
GROUP BY dw_group.groupID, dw_test.testID 
ORDER BY dw_group.groupOrder, dw_test.testOrder 

所以我已經更新到包括另一個記錄,但引起我的悲傷:

SELECT dw_group.groupText, dw_test.testID, dw_test.testText, dw_test.testCalc 
FROM (SELECT * FROM dw_test WHERE testCalc = 1) dw_group RIGHT JOIN (dw_test RIGHT JOIN dw_sub ON dw_test.testID = dw_sub.subTest) ON dw_group.groupID = dw_test.testGroup 
WHERE testActive=1 AND subSpec=100 AND testSite=4 
GROUP BY testID 
ORDER BY groupOrder, testOrder 

我得到:未知列「dw_group.groupText」在「字段列表」

+1

執行一個查詢,該查詢與'dw_sub'(另一個測試'testCalc = 1'的查詢)並將它們與'UNION'結合起來。 – Barmar

+0

「在任何一種情況下,testActive必須爲1,subSpec = 100」如果只有第二個條件在下列情況下才會出現「dw_sub或testCalc爲1」的情況,這怎麼可能? – DarkKnight

回答

0

權加盟dw_sub沒有意義的,因爲你是從日顯示領域另外2個tsbles。從你的描述中,我寧願認爲dw_sub中不存在不在dw_test中的測試。所以,我就離開了加入兩個dw_group和dw_sub到dw_test和地方標準將是:

... where dw_test.testActive=1 AND dw_sub.subSpec=100 AND 
dw_test.testSite=4 and (dw_test.testCalc=1 or dw_sub.subID is not null) 

的使用工會上面可以改寫成被別人建議。

+0

可能在dw_tests中有行,但不在dw_sub中顯示。 dw_test包含所有可能的測試,而dw_sub只是那些正在發送用於測試的測試。對不起,如果不清楚。 –

+0

這是最後的SQL: 'SELECT testID,groupText,testText,testCalc FROM(dw_test LEFT JOIN dw_group ON dw_test.testGroup = dw_group.groupID)LEFT JOIN dw_sub ON dw_test.testID = dw_sub.subTest 其中dw_test.testActive = 1 AND dw_sub.subSpec = 100 AND dw_test.testSite = 4和(dw_test.testCalc = 1或dw_sub.subID不爲空) GROUP BY dw_test.testID ORDER BY dw_group.groupOrder,dw_test.testOrder'謝謝@Shadow –

+0

爲什麼你有查詢中的羣組嗎?如果測試可能在組或子表中出現多次,則使用不同的。您在此表單中的查詢不符合sql標準,只有在某些配置設置存在的情況下才能在mysql中使用。 – Shadow

0

感謝@Barmar我嘗試了UNION和得到這個:

(SELECT dw_test.testID, dw_group.groupText, dw_test.testText, dw_test.testCalc 
    FROM (dw_test LEFT JOIN dw_group ON dw_test.testGroup = dw_group.groupID) RIGHT JOIN dw_sub ON dw_test.testID = dw_sub.subTest 
    WHERE ((dw_test.testActive=1) AND (dw_sub.subSpec=100) AND (dw_test.testSite=4)) 
    GROUP BY dw_test.testID 
    ORDER BY dw_group.groupOrder, dw_test.testOrder 
) 
UNION 
(SELECT dw_test.testID, dw_group.groupText, dw_test.testText, dw_test.testCalc 
    FROM dw_test LEFT JOIN dw_group ON dw_test.testGroup = dw_group.groupID 
    WHERE ((dw_test.testActive=1) AND (dw_test.testSite=4) AND (dw_test.testCalc=1)) 
    GROUP BY dw_test.testID 
    ORDER BY dw_group.groupOrder, dw_test.testOrder 
) 

但是,這在我不能爲了SELECT產生另一個問題。它將顯示第一個查詢中的所有記錄,然後顯示第二個查詢中的所有記錄。如果將ORDER放在SELECT之外,我會得到「SELECT中的一個表不能在全局ORDER子句中使用」