我可以在一个声明中选择它吗?

时间:2012-04-30 07:07:08

标签: mysql

我是一个完整的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 

1 个答案:

答案 0 :(得分: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条件绑定查询。