我有2个mysql表
表1是“qualitaet-inventar”并且有3000行,其中“sachnummer”为AUTO_INCREMENT
http://s14.directupload.net/images/130421/5qzjmv7b.png
表2是“qualitaet”并且有几行..这里是“id”设置为AUTO_INCREMENT 重要的是“sachnummer”可以存在很多次。 (见图中的红色标记)
http://s1.directupload.net/images/130421/yj2qt65d.png
我想做的是从“qualitaet”到“qualitaet-inventar”的左连接
我希望通过在“qualitaet”上显示“创建”的最新日期来对所有“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
问题是需要很长时间才能得到这个结果
http://s7.directupload.net/images/130421/y32di9hc.jpg
使用此代码可以更快地运行
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
但我没有使用此代码获得孔库存和空白日期
http://s14.directupload.net/images/130421/md6pfsz9.jpg
是否有可能以更快的方式为高表行获取此表? :d
http://s7.directupload.net/images/130421/vzb2hosn.jpg
编辑:
这是我的索引
答案 0 :(得分:1)
以下不应比现有查询更快地工作 - 但是根据您的描述,可以执行:
SELECT i.`sachnummer` AS id,
MAX(q.`created`) AS letztemessung,
i.`sachnummer-name` AS sachnummer
FROM `qualitaet-inventar` i
JOIN `qualitaet` q on i.`sachnummer` = q.`sachnummer`
GROUP BY sachnummer
UNION ALL
SELECT i.`sachnummer` AS id,
q.`created` AS letztemessung,
i.`sachnummer-name` AS sachnummer
FROM `qualitaet-inventar` i
LEFT JOIN `qualitaet` q on i.`sachnummer` = q.`sachnummer`
WHERE q.`sachnummer` IS NULL
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
答案 1 :(得分:0)
这是一般的想法,使用较短的表名。
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