Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 具有左联接的SQL查询不允许使用上一个表中的列_Mysql_Sql - Fatal编程技术网

Mysql 具有左联接的SQL查询不允许使用上一个表中的列

Mysql 具有左联接的SQL查询不允许使用上一个表中的列,mysql,sql,Mysql,Sql,我正在形成一个sql查询,如下所示,这给了我一个错误,我不能在内部where子句中使用m1.id SELECT c.id, m.member_no, mc.card_no FROM customer AS c LEFT JOIN ( SELECT * FROM membership WHERE creation_date = (

我正在形成一个sql查询,如下所示,这给了我一个错误,我不能在内部where子句中使用m1.id

SELECT
    c.id,
    m.member_no,
    mc.card_no
FROM
    customer AS c

    LEFT JOIN
    (
        SELECT
            *
        FROM
            membership
        WHERE
            creation_date = (SELECT MAX(creation_date) FROM membership AS m1 WHERE m1.cust_id = 123)
    ) AS m ON m.cust_id = c.id

    LEFT JOIN
    (
        SELECT
            *
        FROM
            member_card
        WHERE
            emboss_date = (SELECT MAX(emboss_date) FROM member_card AS mc1 WHERE mc1.membership_id = m.id)
    ) AS mc ON mc.membership_id = m.id
WHERE
    c.id = 123
表: 客户、会员、会员卡。 客户可以有多个会员,每个会员可以有多张会员卡

桌上顾客

id  name        address
1   amit            abc
2   mohit           xyz
3   rahul           asdf
4   ganesh          pqr
表成员

id  member_no   creation_date   cust_id
21  123         21-09-1978          1
31  234         21-09-1988          2
41  345         21-09-1998          1
51  456         21-09-1977          2
表会员卡

id   card_no        membership_id   emboss_date
111  12345          21              21-09-1978
222  23456          31              21-09-1977
333  34567          21              21-09-1976
444  456789         41              21-09-1975
cust_id是成员表中的外键 会员卡表中的会员卡id外键

现在,我想要所有客户表的客户详细信息,包括最新的会员号(w.r.t创建日期)和卡号(w.r.t浮雕日期),即使客户没有会员资格,客户详细信息也应该存在。参考我上面提出的问题
因此,一个客户应该有一条记录,即最终结果应该包含4行,其中包含来自所有三个表的数据

select 
       c.id, m.member_no, mc.card_no
from customer c
left join (
     select * from membership m
     where creation_date = (select max(creation_date) 
                            from membership where cust_id = m.cust_id)
) m on m.cust_id = c.id 
left join (select * from member_card mc
     where emboss_date = (select max(emboss_date) 
                          from member_card where membership_id = mc.membership_id) 
) mc on mc.membership_id = m.id
where c.id = 123
具有聚合而不是相关性的其他版本

select 
       c.id, m.member_no, mc.card_no
from customer c left join (
      select cust_id, max(creation_date) creation_date 
      from membership 
      group by cust_id) m 
on m.cust_id = c.id left join (
      select membership_id, max(emboss_date) emboss_date
      from member_card mc
      group by membership_id) mc 
on mc.membership_id = m.cust_id 
where c.id = 123

您实际使用的是什么数据库管理系统?您用
mysql
oracle
标记了这个问题(仅仅因为oracle拥有mysql并不意味着它们是同一个DBMS)。请提供您的表结构和示例数据。我不建议使用
SELECT MAX(…
WHERE
子句中。如果这是在存储过程或多语句函数中,则可以将其缓存为中间变量-否则我认为应将其重新格式化为联接。@Dai是否需要更多详细信息?@Tausifmohammad是的,请同时发布完整的表结构,并修改你的查询要删除所有
SELECT*
,你应该总是显式地命名你想要的列,只在临时查询中使用
SELECT*
。嘿,你在第二次连接中错过了一个结束括号。感谢它现在可以工作了。这个sql查询工作正常,但需要很多时间,有没有关于如何改进此查询的建议?@Tausifmohammad…请内部查询中的聚合。此查询:按客户id从成员组中选择客户id,max(创建日期)creation\u date..进行完整表扫描时,我们是否可以在where子句中只选择特定客户,然后获取最大日期。一个问题是,您的聚合版本没有给出max(创建日期)但是它没有给出与最大创建日期相对应的客户id。我们不能在左侧加入查询中将成员身份中的“客户id”与客户身份中的“id”进行比较吗?