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

最后,selectchildtable中对应的行:

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