【发布时间】:2013-04-24 12:05:35
【问题描述】:
我有这个 SQL 查询:
SELECT * FROM magnitudes t1 INNER JOIN value_magnitudes t2 ON t1.id = t2.magnitude_id WHERE t1.floor_id = 42 AND t2.reading_date = (SELECT Max(reading_date) FROM value_magnitudes WHERE t2.magnitude_id = t1.id);
我的数据库架构是:
CREATE TABLE magnitudes (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NULL ,
sdi_id VARCHAR(255) NULL ,
sdi_id_floor VARCHAR(255) NULL ,
visible TINYINT(1) UNSIGNED NULL ,
history TINYINT(1) UNSIGNED NULL ,
created_at DATETIME NULL ,
updated_at DATETIME NULL ,
floor_id INT(11) NULL ,
unit VARCHAR(255) NULL ,
kind_id INT(11) NULL ,
sample_time INT(11) NULL ,
history_from DATETIME NULL DEFAULT 2011-02-22 11:18:07 ,
PRIMARY KEY(id));
CREATE TABLE value_magnitudes (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
value FLOAT NULL ,
magnitude_id INT(11) NULL ,
sdi_belongs_id VARCHAR(255) NULL ,
reading_date DATETIME NULL ,
created_at DATETIME NULL ,
updated_at DATETIME NULL ,
PRIMARY KEY(id));
我真正想要的是,根据magnitudes.id on values_magnitudes.magnitude_id 的最后一个updated_at 获得最后一个value_magnitudes
谢谢。
【问题讨论】:
-
value_magnitudes.magnitude_id 上的索引会有所帮助 - 但您应该始终针对您正在测试运行缓慢的查询运行 EXPLAIN,这将向您展示它是如何“在幕后”工作的,并且是开发人员数据库工具包的重要组成部分
-
其实我是一名程序员,数据库已经做好了XD,每次我必须在这个数据库中做一个SQL查询时我都很紧张,我不能花时间去改进或与DB,只是一些 SQL,即使我也不是 SQL 人,任何人都无能为力,所以我认为 stackoverflow 是最好的解决方案,问。顺便说一句,感谢您的帮助。
-
如果您不能花时间添加该索引,或者如果 SQL 人员无法为数据库设计添加正确的索引(value_magnitudes.magnitude_id 与magnitudes.id 应该使用外部索引)键约束),那么提高查询速度几乎是不可能的
-
好的,谢谢,我会告诉他们,我只是想找到解决办法,谢谢。
标签: php mysql sql database-schema