Mawg
Mawg

Reputation: 40175

Can I SELECT this in a single stament?

I am a total SQL noob; sorry.

I have a table

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    |       |
+--------------+---------+------+-----+---------+-------+

Normally activity is a two-step process; 1) "check out" and 2 "use"

An item cnnot be checked out a second time, unless used.

Now I want to find any cases where an item was checked out but not used.

Being dumb, I would use two selects, one for check out &one for use, on the same item, then compare the timestamps.

Is there a SELECT statemnt that will help me selct the items which were checked out but not used?

Tricky with the possibility of multipel checkouts. Or should I just code

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

Upvotes: 0

Views: 65

Answers (1)

Ja͢ck
Ja͢ck

Reputation: 173642

You could get the last date of each checkout or use and then compare them per item:

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);

The NOT(last_use >= last_co) is written that way because of how NULL compare behaviour works: last_use < last_co will not work if last_use is null.

Without proper indexing, this query will not perform very well though. Plus you might want to bound the query using a WHERE condition.

Upvotes: 2

Related Questions