我有一个示例数据:
users(id, name)
1 | peter
...
usermeta(user_id, meta_key, meta_value)
1 | level | 10
1 | display | pc
...
points(user_id, type, point)
1 | like | 5
2 | comment| 10
...
和mysql:
SELECT u.*,
(case when m.meta_key = 'level' then m.meta_value end) level ,
p.points AS point
FROM users u
LEFT JOIN points p ON p.user_id = u.id
LEFT JOIN usermeta AS m ON m.user_id = u.id
结果级别= NULL,如何解决?
id | name | level | point
1 | peter| NULL | 5
1 | peter| 10 | 10
答案 0 :(得分:1)
将m.meta_key = 'level'
作为连接条件。
SELECT u.*,
m.meta_value AS level ,
p.points AS point
FROM users u
LEFT JOIN points p ON p.uid = u.id
LEFT JOIN usermeta AS m ON m.user_id = u.id AND m.meta_key = 'level'
答案 1 :(得分:1)
您是否尝试过向CASE
提供ELSE条款?根据您的表p.uid
不存在,它应该是p.user_id
,对吗?
此外,在这种情况下,您应该使用INNER JOIN
,因为您只想检索 id
表中的users
字段与之匹配的情况 points
和usermeta
分别为SELECT
u.*,
CASE WHEN m.meta_key = 'level' THEN m.meta_value ELSE NULL END AS level,
p.points AS point
FROM users u
INNER JOIN points p ON p.user_id = u.id
INNER JOIN usermeta m ON m.user_id = u.id
和{{1}}。这应该正常工作:
{{1}}