我已经阅读了很多关于自联接的例子,但它们似乎并没有涵盖某些字段不在某些行中的情况。
例如,我有一个数据库:
testId, testItem, testResult
行:
1,test1,1
1,test2,0
1,test3,1
2,test1,0
2,test4,1
2,test5,1
我想要输出:
testItem,a.testId,b.testId,a.testResult,b.testResult
test1,1,2,1,0
test2,1,NULL,0,NULL
test3,1,NULL,1,NULL
test4,NULL,2,NULL,1
test5,NULL,2,NULL,1
基本上,我想比较来自两个不同testIds(1和2)的每个testItem(test1-> test5),并比较它们的testResult值,并考虑可能没有相同测试项的testIds。
答案 0 :(得分:1)
鉴于您的确切要求,您可以尝试:
select testItem
, max(case when testID = 1 then testID else null end) as testID1
, max(case when testID = 2 then testID else null end) as testID2
, max(case when testID = 1 then testResult else null end) as testResult1
, max(case when testID = 2 then testResult else null end) as testResult2
from mytable
where testID in (1,2)
group by testItem
这会对您的数据做出很多假设,所以请大家多加一点。
答案 1 :(得分:0)
看起来你想要一个FULL OUTER JOIN,MySQL不支持。您可以使用两个查询的UNION来模拟它:LEFT JOIN查询和RIGHT JOIN,它会抛出匹配的行。
这样的东西将返回指定的结果集:
SELECT a.testItem
, a.testId AS `a.testId`
, b.testId AS `b.testId`
, a.testResult AS `a.testResult`
, b.testResult AS `b.testResult`
FROM mytable a
LEFT
JOIN mytable b
ON b.testItem = a.testItem
AND b.testId = 2
WHERE a.testId = 1
AND a.testItem IN ('test1','test2','test3','test4','test5')
UNION ALL
SELECT d.testItem
, c.testId
, d.testId
, c.testResult
, d.testResult
FROM mytable d
LEFT
JOIN mytable c
ON c.testItem = d.testItem
AND c.testId = 1
WHERE d.testId = 2
AND d.testItem IN ('test1','test2','test3','test4','test5')
AND c.testId IS NULL
ORDER
BY 1,2,4
(我在testItem IN('test1'to'test5')中包含了谓词,因为你指定了它作为一个要求;如果你想要包含testItem的所有值,那么可以删除那些谓词。)
答案 2 :(得分:0)
select testItem,
group_concat(IFNULL(testId,'null') separator ', ') testIds,
group_concat(IFNULL(testResult, 'null') separator ', ') testResults
from table_name group by testItem;