, user_id, 1. :
SELECT *
FROM myTable
WHERE user_id = 2
ORDER BY date DESC
LIMIT 1;
, , action_id . , :
action_values:
| id | action |
+----+-----------+
| 1 | up |
| 2 | down |
| 3 | confirm |
| 4 | unconfirm |
actions:
| id | user | user_id | actionID | date |
+----+------+---------+----------+------------+
| 1 | 1 | 2 | 1 | 2014-11-03 |
| 2 | 1 | 2 | 1 | 2014-11-03 |
| 3 | 1 | 2 | 2 | 2014-11-03 |
| 4 | 1 | 2 | 2 | 2014-11-03 |
| 5 | 1 | 2 | 2 | 2014-11-03 |
| 6 | 1 | 2 | 1 | 2014-11-03 |
| 7 | 1 | 2 | 3 | 2014-11-03 |
| 8 | 1 | 2 | 4 | 2014-11-03 |
| 9 | 1 | 2 | 3 | 2014-11-03 |
| 10 | 1 | 2 | 1 | 2014-11-03 |
| 11 | 3 | 2 | 2 | 2014-11-03 |
| 12 | 3 | 2 | 1 | 2014-11-03 |
| 13 | 3 | 2 | 3 | 2014-11-03 |
, . , . SQL .
, . . , N , , . .
, SQL Fiddle , . , , , :
SELECT *
FROM myTable m
WHERE(
SELECT COUNT(*)
FROM myTable mt
WHERE mt.user_id = 2
AND m.user_id = 2
AND mt.user = m.user
AND mt.date >= m.date
AND (mt.up = 1 OR mt.down = 1)
) <= 1
AND (m.up = 1 OR m.down = 1);
, , , , 2, , , 0 1 . , , - . , /unconfirms, UNION - :
(SELECT *
FROM myTable m
WHERE(
SELECT COUNT(*)
FROM myTable mt
WHERE mt.user_id = 2
AND m.user_id = 2
AND mt.user = m.user
AND mt.date >= m.date
AND (mt.up = 1 OR mt.down = 1)
) <= 1
AND (m.up = 1 OR m.down = 1))
UNION
(SELECT *
FROM myTable m
WHERE(
SELECT COUNT(*)
FROM myTable mt
WHERE mt.user_id = 2
AND m.user_id = 2
AND mt.user = m.user
AND mt.date >= m.date
AND (mt.confirm = 1 OR mt.confirm = 1)
) <= 1
AND (m.confirm = 1 OR m.confirm = 1));
, , , , , , , .