Я создаю это приложение, где важно регистрироваться, если человек активен или нет в текущий день. Моя структура таблицы выглядит так:
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| kid_id | int(11) | NO | | NULL | |
| status | varchar(50) | NO | | NULL | |
| timestamp | timestamp | NO | | CURRENT_TIMESTAMP | |
Что для меня важно; - выбирать только значения с отметкой времени, равной текущему дню. Затем мне нужно проверить, является ли последний статус "активным" или "неактивным", конечно, на основе kid_id. До сих пор я понял.
SELECT kid_id , status , timestamp FROM actions WHERE date(timestamp) = CURDATE() ORDER BY timestamp DESC;
Что возвращает эти значения:
+--------+----------+---------------------+
| kid_id | status | timestamp |
+--------+----------+---------------------+
| 4 | active | 2010-08-23 12:10:03 |
| 3 | inactive | 2010-08-23 10:53:18 |
| 3 | active | 2010-08-23 10:53:10 |
+--------+----------+---------------------+
Теперь только проблема заключается в том, что я получаю как активный, так и неактивный статус с "kid_id" = "3". Поэтому мой вопрос заключается в том, как выбрать только последний статус из каждого kid_id.
Заранее благодарю вас за помощь. Он оценил.
---------- EDIT
Я постараюсь сделать свою мысль более ясной.
Это моя таблица, поскольку она выглядит прямо сейчас...
+--------+----------+---------------------+
| kid_id | status | timestamp |
+--------+----------+---------------------+
| 3 | inactive | 2010-08-23 18:32:19 |
| 4 | active | 2010-08-23 12:10:03 |
| 3 | active | 2010-08-23 10:53:10 |
+--------+----------+---------------------+
3 rows in set (0.00 sec)
Я хочу получить эти значения, и только эти
| 3 | inactive | 2010-08-23 18:32:19 |
| 4 | active | 2010-08-23 12:10:03 |
Все предлагаемые ниже решения возвращают следующие значения:
| 4 | active | 2010-08-23 12:10:03 |
| 3 | active | 2010-08-23 10:53:10 |
Кстати... Спасибо за все ответы так скоро, я очень благодарен за всю помощь.
Сегодня я вышел из офиса. В то же время я выяснил, как решить мою проблему. Я использовал подзаголовок, который работал.
В конце мой код выглядит немного как ovais.tariq
Вот мое решение:
SELECT *
FROM (
SELECT * FROM actions
AS a
WHERE date(timestamp) = curdate()
AND timestamp = (
SELECT max(timestamp)
FROM actions
AS b
WHERE a.kid_id = b.kid_id
)
)
AS c
Спасибо всем за вашу помощь:)
это должно делать
SELECT a1.*
FROM actions AS a1
INNER JOIN (SELECT kid_id, MAX(`timestamp`) AS `timestamp`
FROM actions
WHERE date(timestamp) = CURDATE()
GROUP BY kid_id) AS a2
ON a2.kid_id = a1.kid_id AND a2.timestamp = a1.timestamp
ваше предложение WHERE должно читать
WHERE ... AND status = 'active'
Если у вас могут быть разные строки для одного пользователя в определенный день, для которых установлено значение active, вы можете сказать
SELECT DISTINCT kid, status ...
Обратите внимание, что это возвращает уникальные значения для всего, что вы выбираете, поэтому вы не должны выбирать метку времени, потому что разные метки времени в тот же день для одного и того же пользователя снова будут отображаться как несколько строк (поскольку они не различаются )
используйте group by kid_id
, который выбирает только последнюю строку, которую вы упорядочили по метке времени
SELECT kid_id , status , timestamp FROM actions WHERE date(timestamp) = CURDATE() GROUP BY kid_id ORDER BY timestamp DESC
Используйте group by
следующим образом:
SELECT kid_id , status , timestamp, count(*) as TotalMatches FROM actions WHERE date(timestamp) = CURDATE() GROUP BY kid_id ORDER BY timestamp DESC
[EDIT]: для выбора только активных статусов:
SELECT kid_id , status , timestamp, count(*) as TotalMatches FROM actions WHERE date(timestamp) = CURDATE() AND status = 'active' GROUP BY kid_id ORDER BY timestamp DESC