Mysql 具有左联接的SQL查询不允许使用上一个表中的列
我正在形成一个sql查询,如下所示,这给了我一个错误,我不能在内部where子句中使用m1.idMysql 具有左联接的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 = (
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”进行比较吗?