我有一个餐桌食品吧,是使用以下 DDL 创建的。 (我使用的是mySQL 5.1.x)
CREATE TABLE foodbar (
id INT NOT NULL AUTO_INCREMENT,
user_id INT NOT NULL,
weight double not null,
created_at date not null
);
我有四个问题:
- 我如何编写返回的查询
一个结果集给了我
以下信息:user_id,
重量增益 其中重量增益是
重量和重量之间的差异
7天记录的体重
前。
- 我如何编写一个查询
返回前 N 个用户
最大的体重增加(再说一遍
一周)。?一个“明显”的方法可能是
使用问题1中获得的查询
上面作为子查询,但不知何故
选取前 N 个。
- 由于在问题2中(事实上
问题1),我正在搜索
表中的记录使用
计算字段,索引将是
最好优化查询 -
然而,由于它是一个计算的
领域,不清楚是哪个领域
索引(我猜“权重”
领域是需要的领域
索引)。我这样说对吗?
假设?。
- 假设我有另一个领域
食物吧台(说“高度”)和我
想要从以下位置选择记录
基于(比如说)产品的表格
(即乘法)“高度”
和“体重”——我会在吗
再次假设我需要索引
'身高和体重'?。我也这样吗
需要创建一个复合键(比如
(身高体重))。如果这个问题
不清楚,我很乐意
阐明
我不明白为什么您应该需要合成密钥,所以我将使用此表:
CREATE TABLE foodbar (
user_id INT NOT NULL
, created_at date not null
, weight double not null
, PRIMARY KEY (user_id, created_at)
);
我如何编写一个返回结果集的查询,该结果集为我提供以下信息:user_id,weight_gain,其中weight_gain是体重与7天前记录的体重之间的差值。
SELECT curr.user_id, curr.weight - prev.weight
FROM foodbar curr, foodbar prev
WHERE curr.user_id = prev.user_id
AND curr.created_at = CURRENT_DATE
AND prev.created_at = CURRENT_DATE - INTERVAL '7 days'
;
日期算术语法可能是错误的,但你明白了
我如何编写一个查询来返回体重增加最多的前 N 个用户(同样是在一周内)?一种“明显”的方法可能是使用上面问题 1 中获得的查询作为子查询,但以某种方式选择前 N 个。
见上文,添加ORDER BY curr.weight - prev.weight DESC
and LIMIT N
对于最后两个问题:不要猜测,检查执行计划。 (postgresql 有EXPLAIN ANALYZE
,不知道 mysql)你可能会发现你需要索引参与的列WHERE
and JOIN
,而不是形成结果集的那些。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)