2015-10-01 47 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子句中使用”