使用子查询获取主查询的信息

时间:2017-05-08 20:01:13

标签: mysql subquery

所以我的第一个查询效果很好:

$sql = "SELECT mbr_id, exp_bill, plan_id FROM plan_state WHERE exp_bill <= ((NOW() - INTERVAL 60 DAY)) AND (plan_id BETWEEN 5 AND 11) ORDER BY `plan_state`.`exp_bill` DESC";

但我需要将它与这个结合起来:

$sql = "SELECT id, name_first, name_last, language FROM member WHERE id = mbr_id";

(mbr_id来自第一个查询。)

我尝试了几个子查询但无法使其工作。

然后我需要回应结果。

谢谢!任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:0)

使用联接:

SELECT member.id, name_first, name_last, language
FROM member
INNER JOIN plan_state
    ON member.id = plan_state.mbr_id
WHERE exp_bill <= (NOW() - INTERVAL 60 DAY) AND plan_id BETWEEN 5 AND 11
/* group by/order by, etc */

请记住联接行为的方式,如果plan_state(B)中有多行与member(A)匹配,那么您最终会得到基本上“重复”的行表A的输出,表B中的唯一数据连接到那些“重复”行。

答案 1 :(得分:0)

这是一个例子

SELECT ps.mbr_id
     , ps.exp_bill
     , ps.plan_id
     , m.id
     , m.name_first
     , m.name_last
     , m.language 
FROM Plan_State ps
INNER JOIN Member m
 on PS.mbr_ID = m.Id
WHERE ps.exp_bill <= (NOW() - INTERVAL 60 DAY)
  AND ps.plan_id BETWEEN 5 AND 11
ORDER BY ps.exp_bill DESC

现在,如果您需要来自plan_state的所有记录以及会员中的相关记录,请使用left join代替inner join。如果您需要来自成员的所有记录,并且只需要那些在计划状态下匹配的记录,那么请使用Right join而不是inner join但是,您使用正确的联接,必须将where子句标准移动到加入以保留成员的不匹配记录。

'ps'和'm'是表别名,它减少了完全限定的列名,并且通常提高了可读性。