嵌套select,还是我太复杂了?

gopyfrb3  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(290)

我有以下表格:
表1

id
name
number
status

表2

id
table1_id
transaction_no
transaction_date

我要返回table1.name、table1.num、table2.transaction\u no的列表,其中table1.status=“active”和最近的table2.transaction\u日期早于4个月。
我一直在尝试这样的东西,但是语法在不同的地方都失败了。

SELECT tab1.name, tab1.num, tab2.transaction_no
FROM table1 AS tab1
INNER JOIN table2 AS tab2 ON tab1.id = tab2.table1_id
WHERE tab1.status = "Active"
AND 
(SELECT MAX(tab2.transaction_date) FROM tab2 
 GROUP BY tab1.name) <= (date 4 months ago)

我知道这是不对的,但我的大脑正在努力围绕着这个想法,或者我让它变得更复杂。如有任何建议或指导,将不胜感激。

brc7rcf0

brc7rcf01#

那个 GROUP BY tab1.name 在子查询中没有意义。 tab1 不在子查询的上下文中(也不在 tab2 为此)。相反,您可以执行相关子查询:

AND (SELECT MAX(t2.transaction_date) FROM table2 t2 WHERE t2.table1_id = tab1.id) <= (date 4 months ago)

现在子查询可以独立存在,并且通过where子句与主查询正确关联。
如果您只需要最新的t2记录(而且必须是4个多月前的记录),那么from子句中的子查询将起作用:

SELECT tab1.name, tab1.num, tab2.transaction_no
FROM table1 AS tab1
   INNER JOIN (
    SELECT transaction_no, table1_id 
    FROM table2 t2 
    WHERE transaction_date = (SELECT max(transaction_date) FROM table2 WHERE table1_id = t2.table1_id)
   ) AS tab2 
    ON tab1.id = tab2.table1_id
WHERE tab1.status = "Active";

在这里,我们仍然使用一个相关子查询从表2中获取每个表1\u id的事务日期最大的记录,然后将每个表1\u id的一个记录连接回table1.id。

相关问题