用“连接多个表”;分组方式;MySQL中的最新日期
我有两张mysql表 表1为“Qualitate inventar”,有3000行,其中“sachnummer”为自动增量用“连接多个表”;分组方式;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”中
表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是个问题?