anonymous@RULINUX.NET~# Last login: 2024-12-23 11:47:03
Регистрация Вход Новости | Разметка | Пользователи | Галерея | Форум | Статьи | Неподтвержденное | Трекер | Правила форума | F.A.Q. | Ссылки | Поиск
[#] [Добавить метку] [Редактировать]
Скрыть

[mysql] подскажите запрос

есть одна табличка:

sql
mysql> SELECT * FROM table1;
+----+-------------+---------------------+-----------+
| id | location_id | dt                  | city_name |
+----+-------------+---------------------+-----------+
|  1 |          34 | 2012-01-17 11:00:00 | Kiev      |
|  2 |          34 | 2012-01-17 12:30:00 | Kiev      |
|  3 |          51 | 2012-01-17 10:00:00 | Moskow    |
|  4 |          51 | 2012-01-17 10:35:00 | Moskow    |
+----+-------------+---------------------+-----------+
 


Надо: выбрать записи, в которых максимальная дата по каждому городу. То есть, должно получиться типа того:

sql
+----+-------------+---------------------+-----------+
| id | location_id | max(dt)             | city_name |
+----+-------------+---------------------+-----------+
|  2 |          34 | 2012-01-17 12:30:00 | Kiev      |
|  2 |          51 | 2012-01-17 10:35:00 | Moskow    |
+----+-------------+---------------------+-----------+
 


select id,max(dt), city_name from table1 group by city_name; - не пойдет, потому что он пересчитывает id и они не соответствуют другим полям. Знаю, как с объединением самой с собой сделать, но это как-то несерьезно же...

vitroot(*) (2012-08-08 17:37:45)

Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:14.0) Gecko/20100101 Firefox/14.0.1

[Ответить на это сообщение]
[#] [Добавить метку] [Редактировать] Ответ на: [mysql] подскажите запрос от vitroot 2012-08-08 17:37:45
avatar
Скрыть

Re:[mysql] подскажите запрос

SystemV или Tuxoid полюбому должны справиться :)

vitroot(*)(2012-08-08 17:41:56)

Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:14.0) Gecko/20100101 Firefox/14.0.1
[#] [Добавить метку] [Редактировать] Ответ на: [mysql] подскажите запрос от vitroot 2012-08-08 17:37:45
avatar
Скрыть

Re:[mysql] подскажите запрос

С подзапросами например так.

]
SELECT id, dt AS dat, city_name FROM table1 WHERE dt IN (SELECT max(dt) FROM table1 GROUP BY city_name)
 

З.Ы. Сорри отвлекся на работу.

Tux-oid(*)(2012-08-08 17:51:49)

Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20120604 Firefox/13.0 SeaMonkey/2.10
[#] [Добавить метку] [Редактировать] Ответ на: Re:[mysql] подскажите запрос от Tux-oid 2012-08-08 17:51:49
avatar
Скрыть

Re:[mysql] подскажите запрос

> SELECT id, dt AS dat, city_name FROM table1 WHERE dt IN (SELECT max(dt) FROM table1 GROUP BY city_name)
> Позор джунглям)))


SELECT a.id, a.dt AS dat, a.city_name FROM table1 a WHERE a.dt IN ( SELECT max(b.dt) FROM table1 b GROUP BY b.city_name WHERE b.city_name = a.city_name )

Ax-Xa-Xa(*)(2012-08-08 18:02:53)

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.57 Safari/537.1
[#] [Добавить метку] [Редактировать] Ответ на: Re:[mysql] подскажите запрос от Ax-Xa-Xa 2012-08-08 18:02:53
avatar
Скрыть

Re:[mysql] подскажите запрос

Не понял что тебе не понравилось?

Tux-oid(*)(2012-08-08 18:05:51)

Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20120604 Firefox/13.0 SeaMonkey/2.10
[#] [Добавить метку] [Редактировать] Ответ на: [mysql] подскажите запрос от vitroot 2012-08-08 17:37:45
avatar
Скрыть

Re:[mysql] подскажите запрос

> не пойдет, потому что он пересчитывает id и они не соответствуют другим полям
хм это как?

bugmaker(*)(2012-08-08 18:08:24)

Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:14.0) Gecko/20100101 Firefox/14.0.1
[#] [Добавить метку] [Редактировать] Ответ на: Re:[mysql] подскажите запрос от Tux-oid 2012-08-08 18:05:51
avatar
Скрыть

Re:[mysql] подскажите запрос

алсо вложеные запросы - зло

bugmaker(*)(2012-08-08 18:11:49)

Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:14.0) Gecko/20100101 Firefox/14.0.1
[#] [Добавить метку] [Редактировать] Ответ на: Re:[mysql] подскажите запрос от Tux-oid 2012-08-08 17:51:49
avatar
Скрыть

Re:[mysql] подскажите запрос

спасибо. это куда лучше, чем джойны клепать )

vitroot(*)(2012-08-08 18:15:03)

Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:14.0) Gecko/20100101 Firefox/14.0.1
[#] [Добавить метку] [Редактировать] Ответ на: [mysql] подскажите запрос от vitroot 2012-08-08 17:37:45
avatar
Скрыть

Re:[mysql] подскажите запрос

В один красивый запрос, без джойнов или подзапросов, такое имхо не сделать. Так что бери что-нибудь из предложенного выше.

SystemV(*)(2012-08-08 18:19:35)

Emacs-w3m/1.4.503 w3m/0.5.3
[#] [Добавить метку] [Редактировать] Ответ на: Re:[mysql] подскажите запрос от vitroot 2012-08-08 18:15:03
avatar
Скрыть

Re:[mysql] подскажите запрос

если база большая предвидится, а клиентов много - не делай так. На вложенный запрос делается временная неиндексированная табличка, это очень медленно, да ещё основная может лочиться. Алсо я так и не понял, что у тебя за проблемы с id.

bugmaker(*)(2012-08-08 18:20:55)

Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:14.0) Gecko/20100101 Firefox/14.0.1
[#] [Добавить метку] [Редактировать] Ответ на: Re:[mysql] подскажите запрос от Tux-oid 2012-08-08 18:05:51
avatar
Скрыть

Re:[mysql] подскажите запрос

> Не понял что тебе не понравилось?
Может схватить дату от другого города

Ax-Xa-Xa(*)(2012-08-08 18:22:59)

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.57 Safari/537.1
[#] [Добавить метку] [Редактировать] Ответ на: Re:[mysql] подскажите запрос от bugmaker 2012-08-08 18:20:55
avatar
Скрыть

Re:[mysql] подскажите запрос

>> Алсо я так и не понял, что у тебя за проблемы с id.
id в том варианте расчитывается фактически с другой позиции. Выполни запрос для проверки - увидишь. Для id не задано условие, поэтому оно выводится с самого начала, в то время как поля типа dt вывоятся с условием MAX(), из-за чего в итоге между полями нестыковки

vitroot(*)(2012-08-08 18:23:23)

Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:14.0) Gecko/20100101 Firefox/14.0.1
[#] [Добавить метку] [Редактировать] Ответ на: [mysql] подскажите запрос от vitroot 2012-08-08 17:37:45
avatar
Скрыть

Re:[mysql] подскажите запрос

Вот тут люди обсуждают производительность таких запросов.

SystemV(*)(2012-08-08 18:31:10)

Emacs-w3m/1.4.503 w3m/0.5.3
[#] [Добавить метку] [Редактировать] Ответ на: Re:[mysql] подскажите запрос от Tux-oid 2012-08-08 18:05:51
avatar
Скрыть

Re:[mysql] подскажите запрос

> Не понял что тебе не понравилось?

У тебя там могут выводиться лишние, неправильные строки.

anonymous(*)(2012-08-08 18:36:23)

[#] [Добавить метку] [Редактировать] Ответ на: Re:[mysql] подскажите запрос от anonymous 2012-08-08 18:36:23
avatar
Скрыть

Re:[mysql] подскажите запрос

Да я уже понял. Выполнил запрос в реале.

Tux-oid(*)(2012-08-08 18:37:32)
Отредактировано Tux-oid по причине "не указана"
Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20120604 Firefox/13.0 SeaMonkey/2.10
[#] [Добавить метку] [Редактировать] Ответ на: Re:[mysql] подскажите запрос от vitroot 2012-08-08 18:23:23
avatar
Скрыть

Re:[mysql] подскажите запрос

> id в том варианте расчитывается фактически с другой позиции. Выполни запрос для проверки - увидишь. Для id не задано условие, поэтому оно выводится с самого начала, в то время как поля типа dt вывоятся с условием MAX(), из-за чего в итоге между полями нестыковки
ну да, на то они и агрегатные функции. Тогда где-то так

sql
SELECT * FROM table1 AS t1 RIGHT OUTER JOIN (SELECT location_id,min(dt) AS mdt FROM table1 GROUP BY location_id) AS tt ON tt.location_id=t1.location_id AND mdt=t1.dt;
 


Чтоб поржать,

sql
SELECT * FROM (SELECT * FROM table1 AS t1 ORDER BY dt DESC) AS t2 GROUP BY location_id;
 

bugmaker(*)(2012-08-08 21:03:17)

Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:14.0) Gecko/20100101 Firefox/14.0.1
[#] [Добавить метку] [Редактировать] Ответ на: Re:[mysql] подскажите запрос от anonymous 2012-08-08 18:36:23
avatar
Скрыть

Re:[mysql] подскажите запрос

> неправильные
сам ты неправильный. Это же ТУННЕЛЬНЫЕ ТРЕДЫ

bugmaker(*)(2012-08-08 21:04:58)

Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:14.0) Gecko/20100101 Firefox/14.0.1
Этот тред читают 1 пользователь:
Анонимных: 1
Зарегистрированных: 0




(c) 2010-2020 LOR-NG Developers Group
Powered by TimeMachine

Valid HTML 4.01 Transitional Правильный CSS!