我进行以下选择,以获取(感兴趣的)所有我感兴趣的相关数据:
SELECT id, action, actions.uid, name, relation
FROM actions
LEFT JOIN (SELECT * FROM relations GROUP BY uid) USING (uid)
INNER JOIN users USING (uid)
GROUP BY actions.id;
当我需要使用条件根据关系类型“删除”结果时,会发生问题。
我进行以下查询以丢弃先前结果中的“朋友”(关系):
SELECT id, action, actions.uid, name, relation
FROM actions
LEFT JOIN (SELECT * FROM relations GROUP BY uid) USING (uid)
INNER JOIN users USING (uid)
WHERE relation != 'friend'
GROUP BY actions.id;
但是它应该返回一个结果(玛丽),并且它返回0个结果...
我不喜欢由于'... WHERE关系IS NULL'之类的类型条件而获得Marie,我的查询应该属于废弃过滤器,因为它们属于过滤工具。
[尝试使用Coalesce(Relation,'')!='friend'。希望它起作用
您需要使用on
子句进行过滤:
SELECT id, action, actions.uid, name, relation
FROM actions LEFT JOIN
relations
USING (uid) AND relation != 'friend' LEFT JOIN -- Don't mix the left & inner join
users USING (uid);
LEFT JOIN
和WHERE
子句将变为INNER JOIN
,与null
进行比较将始终为false。因此,在加入时分开过滤。
但是,我将其重新表达为:
SELECT a.id, a.action, a.uid, u.name, r.relation
FROM actions a INNER JOIN
users u
USING (uid) LEFT JOIN
relation r
USING (uid) AND r.relation != 'friend';