mysql计数数量列和返回行的位置

时间:2011-12-20 00:05:14

标签: php mysql count

我有一张桌子:

ID int
category int
quantity int
timestamp timestamp

我想SELECT id =“id#”并返回一个'position',它是在同一类别中具有较早时间戳的每一行的数量总和。

感谢您的指示!

4 个答案:

答案 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属于同一类别。

我没有对它进行测试,但这些方面的内容应该有效。