消除mySQL子查询

时间:2011-12-21 00:57:59

标签: mysql

如何使用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

2 个答案:

答案 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_namereff_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