[MySQL ] туплю

Ivan826

есть таблица с данными вида
  
| ================== |
| id name status |
| -- ---- ------ |
| 1 Ваня on |
| 2 Петя on |
| 3 Катя on |
| 4 Маша on |
| 5 Маша off |
| 6 Петя off |
| ================== |

Хочу выбрать номера имён с последним значением status=on.
Т.е. результатом запроса SELECT id был бы ответ [1,3] т.к. у имён Маша и Петя последний статус - off
Как написать такой запрос?
По логике вещей где-то должен быть оператор ORDER BY или DISTINCT, но куда его воткнуть не соображу никак
Объединение производится сверху

katrin2201

подзапросы есть?

Ivan826

Подзапросы есть не нужно. Они не съедобные
Ваще существуют и доступны

SCIF32

может типа этого:
select id from xxx group by status ?

katrin2201


select * from table as t
where
id = (select max(id) from table where t.name = name)
and status = 1

Без подзапросов и чтоб в один запрос, имхо, никак.

Ivan826

Это было бы замечательно если бы можно было каким-то образом заставить GROUP BY класть в повторяющиеся ключи последнее встречающееся значение, а не первое.
В таблице

|========|
| id name|
| -- ----|
| 2 Вася|
| 4 Вася|
| 8 Вася|
|========|

SELECT id FROM table GROUP BY name вне зависимости от ORDER BY (поскольку он выполняется уже с полученными результатами, если я правильно понимаю) вернёт значение 2.
Собственно вопрос скатывается к тому как получить 8
UPD
To Alepar: К трём часам ночи совсем тяжёло уже стало Действительно в первый раз хрень написал. Но ты меня понял

katrin2201

SELECT id FROM table GROUP BY id вне зависимости от ORDER BY (поскольку он выполняется уже с полученными результатами, если я правильно понимаю)
правильно понимаешь
вернёт значение 2.
Вернет все три строки 2 4 8.
Ты слишком упростил исходную задачу. Тебе нужно добавить второй столбец, который будет одинаковый во всех строках, и по нему делать group by. Вобщем, я понял, что ты хотел сказать.
Собственно вопрос скатывается к тому как получить 8
Никак. Правильная БД типа оракла, афаир, вообще не даст тебе сделать селект чего-то, не упомянутого в груп бай или несаггрегированного чем-нибудь, типа max.

kruzer25

SELECT id FROM table GROUP BY name вне зависимости от ORDER BY (поскольку он выполняется уже с полученными результатами, если я правильно понимаю) вернёт значение 2.
Больше так не пиши!
Этот select вернёт тебе 2, 4 или 8. А что именно - никогда нельзя сказать точно.
В правильных БД при таком запросе вообще должна выдаваться ошибка.

Ivan826

Даже так? Т.е. вообще хз что вернёт? Я был уверен что первое значение по порядку. Но юзать это всё равно нельзя разумеется

kruzer25

Т.е. вообще хз что вернёт?
Да, хз.
Хотя обычно это действительно первое значение.

artimon

mysql> select * from xxx;
+------+------+--------+
| id | name | status |
+------+------+--------+
| 1 | a | on |
| 2 | b | on |
| 3 | c | on |
| 4 | d | on |
| 5 | d | off |
| 6 | b | off |
+------+------+--------+
6 rows in set (0.00 sec)

mysql> select x.id from xxx as x
left join xxx as y on (x.name = y.name and x.id < y.id)
where y.id is null and x.status = 'on';
+------+
| id |
+------+
| 1 |
| 3 |
+------+
2 rows in set (0.00 sec)

Ivan826

Ух! Круто! Надо ботать юзание одной таблицы под двумя именами! Пасибо огромнгое!

vall

о! а вот что придумал.
... MAX(id*2+IF(STRCMP(status,"on"0,1 as xxx ... HAVING xxx % 2 = 1
Оставить комментарий
Имя или ник:
Комментарий: