2017-05-08 73 views
0

所以我有行之有效这第一个查询:使用子查询获取信息的主要查询

$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来自第一个查询。)

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

然后,我需要回应结果。

谢谢!任何帮助感谢!

+0

你需要一个连接而不是子查询。阅读本维恩图方法中的连接以加入解释:https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/ – xQbert

+0

谢谢。我可以看到我需要一个完整的外部连接。 @xQbert我需要使用来自其他记录的记录。感谢您的例子和链接 – Aloha

回答

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需要的所有记录和那些在有关成员代替inner join使用left join。如果您需要成员的所有记录,并且只需要在计划状态中匹配的记录,则使用Right join而不是inner join但是,如果使用正确的连接,则必须将where子句条件移至连接以保留成员中不匹配的记录。

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

0

使用JOIN:

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中的唯一行加入到那些“重复”行中。