0

我是个 SQL 菜鸟;对不起。

我有一张桌子

mysql> describe activity;
+--------------+---------+------+-----+---------+-------+
| Field        | Type    | Null | Key | Default | Extra |
+--------------+---------+------+-----+---------+-------+
| user         | text    | NO   |     | NULL    |       |
| time_stamp   | int(11) | NO   |     | NULL    |       |
| activity     | text    | NO   |     | NULL    |       |
| item         | int     | NO   |     | NULL    |       |
+--------------+---------+------+-----+---------+-------+

通常activity是一个两步过程;1)“签出”和2“使用”

除非item使用,否则不能第二次签出。

现在,我想查找已签出但未使用项目的任何情况。

愚蠢,我会在同一个项目上使用两个选择,一个用于签出和一个用于使用,然后比较时间戳。

是否有一个 SELECT 语句可以帮助我选择已签出但未使用的项目?

多重结账的可能性很棘手。还是我应该只编码

loop over activity, form oldest until newset
  if find a checkout and there is no newer used time then i have a hit 
4

1 回答 1

2

您可以获取每次结帐或使用的最后日期,然后对每个项目进行比较:

SELECT MAX(IF(activity='check out', time_stamp, NULL)) AS last_co, 
MAX(IF(activity='use', time_stamp, NULL)) AS last_use
FROM activity
GROUP BY item
HAVING NOT(last_use >= last_co);

之所以NOT(last_use >= last_co)这样写是因为NULL比较行为是如何工作的:如果为空,last_use<last_co将不起作用。last_use

如果没有适当的索引,这个查询将不会执行得很好。另外,您可能希望使用WHERE条件绑定查询。

于 2012-04-30T07:27:24.910 回答