我是一个完整的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
答案 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
条件绑定查询。