我的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'在'字段列表'
答案 0 :(得分: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)
上述内容可以使用union修改,如其他人所建议的那样。
答案 1 :(得分: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进行排序。它将显示第一个查询中的所有记录,然后显示第二个查询中的所有记录。如果我把SELECT放在SELECT之外,我得到“其中一个SELECT的表不能在全局ORDER子句中使用”