我有一张桌子:
ID int
category int
quantity int
timestamp timestamp
我想SELECT id =“id#”并返回一个'position',它是在同一类别中具有较早时间戳的每一行的数量总和。
感谢您的指示!
答案 0 :(得分:2)
试试这个:
SELECT sum(quantity) FROM TABLE WHERE category='...' AND timestamp < some_timestamp
如果您想按ID选择:
SELECT sum(quantity) FROM mytable
WHERE category IN (SELECT category FROM mytable WHERE id=some_id)
AND timestamp <= some_timestamp
要使用行本身的时间戳,您可以执行以下操作:
SELECT sum(quantity) FROM mytable
WHERE category IN (SELECT category FROM mytable WHERE id=some_id)
AND timestamp <= (SELECT timestamp FROM mytable WHERE id=some_id)
..或者在Adam的答案中使用自我加入(也许这毕竟不是一种矫枉过正的......)。)
这似乎也很好..
SELECT t1.id, sum(t2.quantity), t1.timestamp, t1.category
FROM mytable t1 INNER JOIN mytable AS t2 ON t1.category=t2.category
WHERE t1.id=some_id_here AND t2.timestamp <= t1.timestamp;
将<
更改为<=
,否则将不会计算所选项目的数量!
答案 1 :(得分:0)
您可以使用子查询再次加入您的表格,过滤您的相同类别和较短时间戳的条件。
这是一个例子(这是sqlite,但它应该在mysql中工作):
select
ID,
sum(foo2.quantity)
from
foo
left join (
select category, quantity, timestamp from foo
) as foo2 on (
foo.category = foo2.category
and foo.timestamp > foo2.timestamp
)
group by
foo.ID
假设您的数据如下:
ID|category|quantity|timestamp
1 |foo |2 |2011-01-01
2 |foo |1 |2011-01-02
3 |foo |4 |2011-01-03
4 |bar |4 |2011-01-03
你会得到这样的结果:
ID|sum(foo2.quantity)
1 |null
2 |2
3 |3
4 |null
注意:空值是因为在给定记录之前没有这些类别的数据。
注2:不确定这是多么高效,但它应该能为您提供所需的数据。
<强>更新强>
重新阅读你的问题之后,这看起来有点矫枉过正......我没有意识到你正在传递id,无论哪种方式,你仍然可以使用它并添加where id = "$id"
来限制它我正在寻找...希望这会有所帮助。
答案 2 :(得分:0)
如果我理解你的问题,这样的事情就可以解决问题。
$r = mysql_query("SELECT * FROM table WHERE ID='$id'");
$r = mysql_fetch_array($r);
$cat = $r['category'];
$time = $r['timestamp'];
$r = mysql_query("SELECT SUM(quantity) FROM table WHERE category='$cat' AND timestamp <= '$time'");
前4行检索原始ID并找到类别ID和时间戳。然后我们运行一个新查询来获取比我们的id更早的类别中的所有项目。因为我们使用&lt; =作为时间戳,它将包括我们选择的id的数量。如果我们想要排除我们的ID数量,我们只使用&lt;
编辑:阅读其他一些答案,你可以使用SUM并跳过while循环...你每天都学到新东西。答案改为反映这一点。
答案 3 :(得分:0)
SELECT * FROM table WHERE ID=(SELECT SUM(quantity) WHERE timestamp < some_timestamp AND category = (SELECT category FROM table WHERE ID='given_ID'))
如果我理解正确的话,这会给你一行ID,它是具有较早时间戳的所有行数量的总和,与提供的ID属于同一类别。
我没有对它进行测试,但这些方面的内容应该有效。