如何使用JOIN或其他方法将其转换为单个查询,以消除子查询
SELECT
(SELECT CONCAT(n.first_name, " ",n.last_name)
FROM network n, PROFILE p
WHERE p.net_name = n.uid AND n.user_id = o.user_id) user_name,
(SELECT CONCAT(n.first_name, " ",n.last_name)
FROM network n, PROFILE p
WHERE p.net_name = n.uid AND n.user_id = o.reff_id) reff_name,
o.*
FROM postback o
答案 0 :(得分:2)
这是一个开始:
SELECT CONCAT(n_user.first_name, ' ', n_user.last_name) AS user_name,
CONCAT(n_reff.first_name, ' ', n_reff.last_name) AS reff_name,
o.*
FROM postback o
JOIN network n_user
ON n_user.user_id = o.user_id
JOIN network n_reff
ON n_reff.user_id = o.reff_id
;
您当前的查询将包含postback
行,其中实际上没有对应的user_name
或reff_name
,而上述查询则不会;如果您想保留该行为,请将上述JOIN
更改为LEFT OUTER JOIN
s。
此外,您当前的查询已加入profile
;我不知道为什么。这样做的效果是过滤掉network
中没有相应行的profile
行。这是故意的吗?如果是这样,是强制子查询只返回一行(而不是多行),还是强制子查询返回NULL
(而不是非NULL
)?这将影响基于JOIN
的查询的设计。
答案 1 :(得分:0)
这应该工作。我不确定的是你在两个子查询中加入配置文件的原因。
SELECT CONCAT(users.first_name, " ",users.last_name) as user_name,
CONCAT(reff.first_name, " ",reff.last_name,
o.*
FROM postback o
join network reff on o.reff_id = reff.user_id
join network users on o.user_id = users.user_id