MySQL将行与空条目进行比较

时间:2013-01-27 19:24:41

标签: mysql self-join

我已经阅读了很多关于自联接的例子,但它们似乎并没有涵盖某些字段不在某些行中的情况。

例如,我有一个数据库:

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。

3 个答案:

答案 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)

SQLFiddle Demo

select testItem, 
group_concat(IFNULL(testId,'null') separator ', ') testIds,
group_concat(IFNULL(testResult, 'null') separator ', ') testResults
from table_name group by testItem;