Проблема с MySQL! Нужно выбрать уникальное значение только из одной строки

0

Я создаю это приложение, где важно регистрироваться, если человек активен или нет в текущий день. Моя структура таблицы выглядит так:

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

Кстати... Спасибо за все ответы так скоро, я очень благодарен за всю помощь.

Теги:

5 ответов

-1
Лучший ответ

Сегодня я вышел из офиса. В то же время я выяснил, как решить мою проблему. Я использовал подзаголовок, который работал.

В конце мой код выглядит немного как 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

Спасибо всем за вашу помощь:)

1

это должно делать

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
  • 0
    Извините, но это возвращает оба активных значения, а не неактивные.
  • 0
    я отредактировал запрос, это работает теперь точно.,
1

ваше предложение WHERE должно читать

WHERE ... AND status = 'active'

Если у вас могут быть разные строки для одного пользователя в определенный день, для которых установлено значение active, вы можете сказать

SELECT DISTINCT kid, status ...

Обратите внимание, что это возвращает уникальные значения для всего, что вы выбираете, поэтому вы не должны выбирать метку времени, потому что разные метки времени в тот же день для одного и того же пользователя снова будут отображаться как несколько строк (поскольку они не различаются )

  • 0
    Если я правильно понимаю ваш код, то возвращаются только активные дети, а не неактивные дети. Если я сортирую по отметке времени, я получу значения в порядке, но я все еще не могу удалить последний активный статус для kid_id 3 ... Поправьте меня, если что-то из этого звучит неправильно.
  • 0
    ну ладно, я тоже ошибся, извини. тогда код Shamittomar должен делать то, что вы хотите
0

используйте group by kid_id, который выбирает только последнюю строку, которую вы упорядочили по метке времени

SELECT kid_id , status , timestamp FROM actions WHERE date(timestamp) = CURDATE() GROUP BY kid_id ORDER BY timestamp DESC
  • 0
    Он группируется по kid_id перед сортировкой по отметке времени. Если я пытаюсь сгруппировать после сортировки, возвращается ошибка. ???
  • 0
    Мое решение решило вашу проблему или нет?
Показать ещё 1 комментарий
0

Используйте 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
  • 0
    Это только выбирает активные статусы?
  • 0
    @nickifrandsen, обновлен код для выбора только активных статусов.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню