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

基本的に、2 つの異なる 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

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 に答える
0

MySQL ではサポートされていない FULL OUTER JOIN が必要なようです。これは、LEFT JOIN クエリと、一致する行を捨てる RIGHT JOIN という 2 つのクエリの UNION でエミュレートできます。

このようなものは、指定された結果セットを返します。

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' から 'test5') の述語を含めました。要件として指定したためです。testItem のすべての値を含めたい場合は、これらの述語を削除できます。)

于 2013-01-27T19:37:46.187 に答える