用“连接多个表”;分组方式;MySQL中的最新日期

用“连接多个表”;分组方式;MySQL中的最新日期,mysql,sql,select,join,left-join,Mysql,Sql,Select,Join,Left Join,我有两张mysql表 表1为“Qualitate inventar”,有3000行,其中“sachnummer”为自动增量 表2是“qualitaet”,有两行。。这里的“id”设置为自动增量 重要的是,“sachnummer”可以存在很多次。(参见图中的红色标记) 我想做的是从“qualitaet”到“qualitaet inventar”的左连接 我想通过在“qualitaet”上显示“created”的最新日期来对所有“sachnummer”进行分组 当“qualitaet”中

我有两张mysql表

表1为“Qualitate inventar”,有3000行,其中“sachnummer”为自动增量


表2是“qualitaet”,有两行。。这里的“id”设置为自动增量 重要的是,“sachnummer”可以存在很多次。(参见图中的红色标记)


我想做的是从“qualitaet”到“qualitaet inventar”的左连接

我想通过在“qualitaet”上显示“created”的最新日期来对所有“sachnummer”进行分组

当“qualitaet”中没有“sachnummer”时,请空连接到“qualitaet inventar”


所以我有这个密码

SELECT 
    i.`sachnummer` AS id,
    MAX(q.`created`) AS letztemessung,
    i.`sachnummer-name` AS sachnummer
FROM
        `qualitaet-inventar` i
LEFT JOIN
        `qualitaet` q on i.`sachnummer` = q.`sachnummer`
GROUP BY
        sachnummer
ORDER BY
    sachnummer ASC
问题是要得到这个结果需要很长时间


有了这段代码,它工作得更快

SELECT 
    q.`sachnummer` AS id,
    MAX(q.`created`) AS letztemessung,
    i.`sachnummer-name` AS sachnummer
FROM
    qualitaet q
LEFT JOIN
    `qualitaet-inventar` i on q.`sachnummer` = i.`sachnummer`
GROUP BY
    sachnummer
ORDER BY
    sachnummer ASC
但是我没有得到这个代码的洞清单和空日期

SELECT 
    i.`sachnummer` AS id,
    MAX(q.`created`) AS letztemessung,
    i.`sachnummer-name` AS sachnummer
FROM
        `qualitaet-inventar` i
LEFT JOIN
        `qualitaet` q on i.`sachnummer` = q.`sachnummer`
GROUP BY
        sachnummer
ORDER BY
    sachnummer ASC


对于高表行,是否可以以更快的方式获取此表?:D

编辑:

这是我的索引


这是一般的想法,使用较短的表名

select somefields
from table1 t1 left join table2 t2 on t1.something = t2.something
join (
select something, max(datetimefield) maxdt
from table1
where whatever
group by something
)  t3 on t1.something = t3.something
and t1.datetimefield = maxdt
where whatever

这是一般的想法,使用较短的表名

select somefields
from table1 t1 left join table2 t2 on t1.something = t2.something
join (
select something, max(datetimefield) maxdt
from table1
where whatever
group by something
)  t3 on t1.something = t3.something
and t1.datetimefield = maxdt
where whatever
以下操作的速度不应比现有查询快,但根据您的描述,可以:

另一种可能性:

select id, max(letztemessung) as letztemessung, max(sachnummer) as sachnummer
from
(SELECT `sachnummer` AS id,
        `created` AS letztemessung,
        '' AS sachnummer
 FROM `qualitaet` q
 UNION ALL
 SELECT `sachnummer` AS id,
        cast(null as datetime) AS letztemessung,
        `sachnummer-name` AS sachnummer
 FROM `qualitaet-inventar` i
) sq
group by id 
ORDER BY sachnummer ASC
以下操作的速度不应比现有查询快,但根据您的描述,可以:

另一种可能性:

select id, max(letztemessung) as letztemessung, max(sachnummer) as sachnummer
from
(SELECT `sachnummer` AS id,
        `created` AS letztemessung,
        '' AS sachnummer
 FROM `qualitaet` q
 UNION ALL
 SELECT `sachnummer` AS id,
        cast(null as datetime) AS letztemessung,
        `sachnummer-name` AS sachnummer
 FROM `qualitaet-inventar` i
) sq
group by id 
ORDER BY sachnummer ASC


您的两个查询基本相同。通过像这样更改
中的
join
子句,您所做的一切基本上就是在
连接之间切换。确保在where/join/group子句中使用的所有字段上都有索引。如果在第一个查询中添加条件
where q.`sachnummer`为NULL
,运行需要多长时间?另外,如果您在第二个查询之后立即运行第一个查询,它是否仍然需要同样长的时间?(第一次查询和第二次查询之间的性能差异可能是由于RDBMS在运行第二次查询时重新使用缓存数据造成的。)@markbanister使用where->显示第0-29行(总共1087行,查询耗时22.8324秒)来执行第一次查询第二轮需要22.7028秒。您是否检查了所涉及的表或索引是否需要修复?34秒对于3000行来说是很长的时间。另请参阅-这可能与临时空间问题有关。你的两个问题基本上是一样的。通过像这样更改
中的
join
子句,您所做的一切基本上就是在
连接之间切换。确保在where/join/group子句中使用的所有字段上都有索引。如果在第一个查询中添加条件
where q.`sachnummer`为NULL
,运行需要多长时间?另外,如果您在第二个查询之后立即运行第一个查询,它是否仍然需要同样长的时间?(第一次查询和第二次查询之间的性能差异可能是由于RDBMS在运行第二次查询时重新使用缓存数据造成的。)@markbanister使用where->显示第0-29行(总共1087行,查询耗时22.8324秒)来执行第一次查询第二轮需要22.7028秒。您是否检查了所涉及的表或索引是否需要修复?34秒对于3000行来说是很长的时间。另请参阅-这可能与临时空间问题有关。您的代码:显示第0-2999行(总计3000行,查询时间为22.5699秒)快10秒:),但还不够:D@bernte:我添加了另一个可能的变量-您能检查一下这个变量需要多长时间吗?第二个代码:显示第0-2999行(总共3000行,查询需要0.0176秒)为什么数据查询没有进行任何显式连接,尽管RDBMS通常在连接方面应该做得更好:/可能是我使用xampp的问题?您的代码:显示第0-2999行(总共3000行,查询耗时22.5699秒)快了10秒:),但还不够:D@bernte:我添加了另一个可能的变量-您能检查一下这个变量需要多长时间吗?第二个代码:显示第0-2999行(总共3000行,查询需要0.0176秒)为什么数据查询没有进行任何显式连接,尽管RDBMS通常在连接方面应该做得更好:/也许我使用xampp是个问题?