1

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

例如,我有一个数据库:

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

本质上,我想比较来自两个不同 testId(1 和 2)的每个 testItem(test1->test5)并比较它们的 testResult 值,同时考虑到 testId 可能没有相同的测试项目。

4

3 回答 3

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

这对您的数据做出了很多假设,因此请谨慎对待。

于 2013-01-27T19:52:53.503 回答
0

看起来您想要一个完整的外部联接,这在 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' thru 'test5') 上包含了谓词,因为您将其指定为要求;如果您希望包含 testItem 的所有值,则可以删除这些谓词。)

于 2013-01-27T19:37:46.187 回答
0

SQLFiddle 演示

select testItem, 
group_concat(IFNULL(testId,'null') separator ', ') testIds,
group_concat(IFNULL(testResult, 'null') separator ', ') testResults
from table_name group by testItem;
于 2013-01-27T19:46:34.793 回答