-1

我在进行自我加入时遇到问题。

我有下表:

CREATE TABLE  `test`.`tableN` (
`id` int(10) unsigned NOT NULL auto_increment,  
`Group` int(10) unsigned NOT NULL,  
`Item` int(10) unsigned NOT NULL,
`data` varchar(45) default NULL,
PRIMARY KEY  (`id`)
) 
ENGINE=InnoDB;

INSERT INTO `test`.`tableN` (`Group`,`Item`,`data`)
VALUES 
(1,100,'aaa'),
(1,200,'bbb'),
(2,100,'ccc'),
(2,200,'ddd'),
(3,100,'eee');

然后我需要做的是运行一个查询,该查询在单个行中输出每个“项目”的数据。

我得到的查询是:

SELECT
t1.`Group`,
t1.`item`,
t1.`data`,
t2.`item`,
t2.`data`
FROM tableN t1
LEFT JOIN tableN t2 ON t2.`group`=t1.`group`
WHERE 1=1
AND t1.item = 100
AND t2.item = 200
GROUP BY t1.`Group`;

问题是,这只返回 2 行(第 1 组和第 2 组)。我还需要它为 Group=3 返回一行,即使 item=200 没有条目。

请问我该怎么做。

4

3 回答 3

2

摆脱你的 where 子句,将它全部移动到你的左连接:

SELECT
    t1.`Group`,
    t1.`item`,
    t1.`data`,
    t2.`item`,
    t2.`data`
  FROM `test`.`tableN` AS t1
  LEFT JOIN `test`.`tableN` t2 ON t2.`group`=t1.`group` AND t1.item = 100 AND t2.item = 200
  GROUP BY t1.`Group`;

小提琴

编辑:如果只有组匹配并且 100 和 200 都不等于 t1 (或 t2),这(当然)也会让你获得一排

于 2013-04-05T08:54:34.720 回答
1
SELECT  `GROUP`,
        MAX(CASE WHEN Item = 100 THEN data END) Item100,
        MAX(CASE WHEN Item = 200 THEN data END) Item200
FROM    TableN
WHERE   Item IN (100, 200)
GROUP   BY `GROUP`

输出

╔═══════╦═════════╦═════════╗
║ GROUP ║ ITEM100 ║ ITEM200 ║
╠═══════╬═════════╬═════════╣
║     1 ║ aaa     ║ bbb     ║
║     2 ║ ccc     ║ ddd     ║
║     3 ║ eee     ║ (null)  ║
╚═══════╩═════════╩═════════╝
于 2013-04-05T08:50:52.947 回答
1

将 t2.item = 200 条件放入 JOIN 子句。

SELECT
t1.`Group`,
t1.`item`,
t1.`data`,
t2.`item`,
t2.`data`
FROM tableN t1
LEFT JOIN tableN t2 ON t2.`group`=t1.`group` AND t2.item = 200
WHERE 1=1
AND t1.item = 100
GROUP BY t1.`Group`;
于 2013-04-05T08:51:25.773 回答