嵌套的SELECT,还是我太复杂了?

时间:2018-09-07 20:42:12

标签: mysql sql

我有下表:

表1

id
name
number
status

表2

id
table1_id
transaction_no
transaction_date

我想返回一个table1.name,table1.num,table2.transaction_no的列表,其中table1.status =“ Active”,而最新的table2.transaction_date早于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)

我知道这是不对的,但是我的大脑正在努力地解决这个想法,或者我使它变得更加复杂。任何建议或指导将不胜感激。

1 个答案:

答案 0 :(得分:1)

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";

在这里,我们仍在使用相关子查询来从table2中抓取每个table1_id具有最大transaction_date的记录。然后,我们将每个table1_id的一条记录重新加入table1.id。