SQL select 查询加入
SQL select query join
下面是我的 MYSQL table。我无法弄清楚 MySQl 查询是什么样子的,它只从 parent 中为每个月(按一个月中的最新日期)选择一行及其后续的 child 行。因此,在给定的示例中,它应该来自 child table 的 return 行,ID 为 4,5,6,10,11,12
我认为像下面这样的东西对你有用:
SELECT Child.id
FROM parent
INNER JOIN Child ON parent.id = child.parent_id
WHERE parent.`date` IN (SELECT max(`date`) FROM parent GROUP BY YEAR(`date`), MONTH(`date`))
有趣的部分是 WHERE
子句,我们只抓取 parent
table 记录,其中 date
是特定 [=] 的 max(date)
19=]组合.
好的,让我们把它分成几部分:
首先,select 来自 parent
table 的最大日期,按月分组:
select max(`date`) as max_date from parent group by last_day(`date`)
-- The "last_day()" function returns the last day of the month for a given date
然后,select来自父table的对应行:
select parent.*
from parent
inner join (select max(`date`) as max_date from parent group by last_day(`date`)) as a
on parent.`date` = a.max_date
最后,selectchild
table中对应的行:
select child.*
from child
inner join parent
on child.parent_id = parent.id
inner join (select max(`date`) as max_date from parent group by last_day(`date`)) as a
on parent.`date` = a.max_date;
您可以查看它在 SQL fiddle 上的工作原理。
编辑
上述解决方案有效,但如果您的 table 很大,您可能会遇到问题,因为连接的数据未编入索引。解决此问题的一种方法是创建一个临时 table 并使用此临时 table 获得最终结果:
drop table if exists temp_max_date;
create temporary table temp_max_date
select max(`date`) as max_date
from parent
group by last_day(`date`);
alter table temp_max_date
add index idx_max_date(max_date);
-- Get the final data:
select child.*
from child
inner join parent
on child.parent_id = parent.id
inner join temp_max_date as a
on parent.`date` = a.max_date;
Here's the SQL fiddle for this second solution.
临时 table 仅可访问创建它们的连接,并在连接关闭或终止时被销毁。
记住: 将适当的索引添加到您的 table 中。
此解决方案在无法正确使用索引方面很笨拙,但它比...
SELECT a.*
, c.id
FROM parent a
JOIN
( SELECT DATE_FORMAT(date,'%Y-%m')yearmonth
, MAX(date) max_date
FROM parent
GROUP
BY yearmonth
) b
ON b.max_date = a.date
JOIN child c
ON c.parent_id = a.id;
使用这个 SQL:
SELECT * FROM Child WHERE PARENT_ID IN (
SELECT MAX(ID) FROM Parent GROUP BY LAST_DAY(DATE)
)
这是工作 SQL Fiddle: http://sqlfiddle.com/#!9/d8880/8
下面是我的 MYSQL table。我无法弄清楚 MySQl 查询是什么样子的,它只从 parent 中为每个月(按一个月中的最新日期)选择一行及其后续的 child 行。因此,在给定的示例中,它应该来自 child table 的 return 行,ID 为 4,5,6,10,11,12
我认为像下面这样的东西对你有用:
SELECT Child.id
FROM parent
INNER JOIN Child ON parent.id = child.parent_id
WHERE parent.`date` IN (SELECT max(`date`) FROM parent GROUP BY YEAR(`date`), MONTH(`date`))
有趣的部分是 WHERE
子句,我们只抓取 parent
table 记录,其中 date
是特定 [=] 的 max(date)
19=]组合.
好的,让我们把它分成几部分:
首先,select 来自 parent
table 的最大日期,按月分组:
select max(`date`) as max_date from parent group by last_day(`date`)
-- The "last_day()" function returns the last day of the month for a given date
然后,select来自父table的对应行:
select parent.*
from parent
inner join (select max(`date`) as max_date from parent group by last_day(`date`)) as a
on parent.`date` = a.max_date
最后,selectchild
table中对应的行:
select child.*
from child
inner join parent
on child.parent_id = parent.id
inner join (select max(`date`) as max_date from parent group by last_day(`date`)) as a
on parent.`date` = a.max_date;
您可以查看它在 SQL fiddle 上的工作原理。
编辑
上述解决方案有效,但如果您的 table 很大,您可能会遇到问题,因为连接的数据未编入索引。解决此问题的一种方法是创建一个临时 table 并使用此临时 table 获得最终结果:
drop table if exists temp_max_date;
create temporary table temp_max_date
select max(`date`) as max_date
from parent
group by last_day(`date`);
alter table temp_max_date
add index idx_max_date(max_date);
-- Get the final data:
select child.*
from child
inner join parent
on child.parent_id = parent.id
inner join temp_max_date as a
on parent.`date` = a.max_date;
Here's the SQL fiddle for this second solution.
临时 table 仅可访问创建它们的连接,并在连接关闭或终止时被销毁。
记住: 将适当的索引添加到您的 table 中。
此解决方案在无法正确使用索引方面很笨拙,但它比...
SELECT a.*
, c.id
FROM parent a
JOIN
( SELECT DATE_FORMAT(date,'%Y-%m')yearmonth
, MAX(date) max_date
FROM parent
GROUP
BY yearmonth
) b
ON b.max_date = a.date
JOIN child c
ON c.parent_id = a.id;
使用这个 SQL:
SELECT * FROM Child WHERE PARENT_ID IN (
SELECT MAX(ID) FROM Parent GROUP BY LAST_DAY(DATE)
)
这是工作 SQL Fiddle: http://sqlfiddle.com/#!9/d8880/8