MySQL查询 - 从两个记录集中选择

时间:2015-10-01 23:16:36

标签: php mysql select

我的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'在'字段列表'

2 个答案:

答案 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子句中使用”