Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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 嵌套选择,还是过于复杂?_Mysql_Sql - Fatal编程技术网

Mysql 嵌套选择,还是过于复杂?

Mysql 嵌套选择,还是过于复杂?,mysql,sql,Mysql,Sql,我有以下表格: 表1 表2 我想返回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

我有以下表格:

表1

表2

我想返回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)
我知道这是不对的,但我的大脑正在努力围绕这个想法,或者我让它变得更复杂。如果您有任何建议或指导,我们将不胜感激。

在您的子查询中,按tab1.name分组是没有意义的。tab1不在子查询的上下文中,也不在istab2中。相反,您可以执行相关子查询:

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

在这里,我们仍然使用一个相关子查询从table2中获取每个table1\u id具有最大事务日期的记录。然后,我们将每个table1\u id的一条记录合并回table1.id。

感谢对该格式有帮助的人!!这是朝着正确方向迈出的一步,只要它让我明白,我会把它标记为正确的。我忘了提到我只想要表2中的最新交易。
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)
AND (SELECT MAX(t2.transaction_date) FROM table2 t2 WHERE t2.table1_id = tab1.id) <= (date 4 months ago)
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";