我有下表:
CREATE TABLE yow(
userid INT,
itemid INT,
feedback INT,
value INT)
(userid,itemid,feedback)可以被视为主键,其中每个元组都包含一个值。
我想要一个返回包含以下列的表的查询: userid | itemid | col0 | col1 | COL2
其中col0包含value
yow
中反馈= 0的所有行,而col1包含value
,其中反馈= 1,依此类推。
我有一个有点工作的问题:
SELECT
yow.userid AS uid,
yow.itemid AS iid,
isNull(col0.value, 0) AS col0,
IsNull(col1.value, 0) AS col1,
IsNull(col2.value, 0) AS col2
FROM yow
LEFT JOIN yow AS col0 ON col0.userid=yow.userid AND col0.itemid=yow.itemid
LEFT JOIN yow AS col1 ON col1.userid=yow.userid AND col1.itemid=yow.itemid
LEFT JOIN yow AS col2 ON col2.userid=yow.userid AND col2.itemid=yow.itemid
WHERE col0.feedback = 0
AND col1.feedback = 1
AND col2.feedback = 2
GROUP BY uid, iid
问题是我可以在col1或col2中使用(userid,itemid)值,但不能在其他值中使用。使用此查询,将过滤掉这些行,而不是将缺少的单元格默认为0。
作为一个例子,我得到这样的东西:
+-------+-------+--------+--------+--------+
| UID | IID | COL0 | COL1 | COL2 |
+-------+-------+--------+--------+--------+
| 1 | 101 | 23 | 22 | 241 |
| 1 | 101 | 51 | 13 | 159 |
| 2 | 102 | 22 | 55 | 152 |
| 3 | 103 | 14 | 41 | 231 |
+-------+-------+--------+--------+--------+
但我想要这样的东西,其中col0的缺失值默认为0。
+-------+-------+--------+--------+--------+
| UID | IID | COL0 | COL1 | COL2 |
+-------+-------+--------+--------+--------+
| 1 | 101 | 23 | 22 | 241 |
| 1 | 101 | 51 | 13 | 159 |
| 1 | 102 | 0 | 15 | 142 |
| 2 | 102 | 22 | 55 | 152 |
| 2 | 103 | 0 | 45 | 92 |
| 3 | 103 | 14 | 41 | 231 |
+-------+-------+--------+--------+--------+
有人可以建议修复我的查询或者提出更好的查询吗?我在H2上运行它,所以我认为查询应该有点标准。感谢:)
答案 0 :(得分:1)
where
条件将过滤掉所有null
(缺失)条目。为避免这种情况,您需要将feedback = x
移动到连接条件。请尝试以下方法:
SELECT
yow.userid AS uid,
yow.itemid AS iid,
isNull(col0.value, 0) AS col0,
IsNull(col1.value, 0) AS col1,
IsNull(col2.value, 0) AS col2
FROM yow
LEFT JOIN yow AS col0 ON col0.feedback = 0
AND col0.userid=yow.userid AND col0.itemid=yow.itemid
LEFT JOIN yow AS col1 ON col1.feedback = 1
AND col1.userid=yow.userid AND col1.itemid=yow.itemid
LEFT JOIN yow AS col2 ON col2.feedback = 2
AND col2.userid=yow.userid AND col2.itemid=yow.itemid
GROUP BY uid, iid