Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Distinct update / 17 сообщений из 17, страница 1 из 1
05.09.2014, 17:35:33
    #38738930
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct update
есть таблица
Код: sql
1.
actId, actTit, actFaceId, actFlag


actId - уникальный автономер
actTit тип события
actFaceId номер посещения
actFlag - маркер для метки записи в расчет показателя (для фильтрации)

у нас в одном посещении получается несколько одинаковых целевых actTit, которые мы хотим посчитать, но ряд с этим показателем должен быть учтен только один на каждый actFaceId

вопрос: как проставить этот маркер только для одного ряда с заданным actTit, чтобы комбинации [actTit, actFaceId, actFlag] были только в одном единственном экземпляре?

по сути речь идет о неком update distinct
...
Рейтинг: 0 / 0
05.09.2014, 17:40:04
    #38738937
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct update
на всякий случай пример гипотетических данных таблицы

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
1     boom   25    1
2     doom   25    2
3     goom   25    3
4     boom   25    0  -- уже было
5     boom   25    0  -- уже было
6     boom   56    1  -- другое посещение
7     doom   56    2 
8     doom   56    0  -- уже было
9     boom   57    1 -- опять новое посещение
10    boom   56    0 -- уже было
...
Рейтинг: 0 / 0
05.09.2014, 18:03:03
    #38738955
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct update
Решение найдно...

Код: sql
1.
udpate t set a = 1 where id in (select id from (select id, a, b from t where act = v group by a, b) x)
...
Рейтинг: 0 / 0
05.09.2014, 18:43:29
    #38738993
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct update
Lumix
Код: sql
1.
(select id from (select id, a, b from t where act = v group by a, b) x)

А это зачем так сложно?
Код: sql
1.
(select min(id) from t where act = v group by a, b)
...
Рейтинг: 0 / 0
05.09.2014, 19:22:02
    #38739026
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct update
miksoftLumix
Код: sql
1.
(select id from (select id, a, b from t where act = v group by a, b) x)

А это зачем так сложно?
Код: sql
1.
(select min(id) from t where act = v group by a, b)



О! прикольно, спасибо, я просто всегда думал, что поля, которые мы перечисляем в group by обязательно должны быть перечислены ещё и в селекте. Реально спасибо!
...
Рейтинг: 0 / 0
05.09.2014, 19:26:38
    #38739029
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct update
miksoft,

знаешь почему надо было вводить алиас и вложенные селекты? потому что мускуль запрещает апдейтить селектами из этой же самой таблицы, а трюк с вложенными запросами через алиас он создает промежуточную временную таблицу и поэтому ок

вот)))
...
Рейтинг: 0 / 0
05.09.2014, 19:52:29
    #38739046
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct update
Lumix,

Еще можно попробовать через переменные. Тогда подзапросы такого рода будут вообще не нужны.
...
Рейтинг: 0 / 0
05.09.2014, 21:08:12
    #38739081
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct update
miksoftLumix,

Еще можно попробовать через переменные. Тогда подзапросы такого рода будут вообще не нужны.

а можно поподробнее, что-то я не всекаю про переменные...
вопрос уже решен и решение уже сдано, мне просто интересно чисто из принципа...
...
Рейтинг: 0 / 0
05.09.2014, 22:46:15
    #38739118
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct update
LumixmiksoftLumix,

Еще можно попробовать через переменные. Тогда подзапросы такого рода будут вообще не нужны.

а можно поподробнее, что-то я не всекаю про переменные...См. 7489069 Lumixвопрос уже решен и решение уже сдано, мне просто интересно чисто из принципа...Если у вас MySQL до версии 5.6, то я бы такое решение с in (select ...) не принял. Или, по крайней мере, только после сравнения со всеми остальными вариантами по быстродействию.
...
Рейтинг: 0 / 0
05.09.2014, 23:14:05
    #38739130
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct update
miksoftЕсли у вас MySQL до версии 5.6, то я бы такое решение с in (select ...) не принял. Или, по крайней мере, только после сравнения со всеми остальными вариантами по быстродействию.

я в версиях особо не секу, но данное решение было сдано на MariaDB-5.5.38
...
Рейтинг: 0 / 0
05.09.2014, 23:35:54
    #38739142
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct update
miksoftСм. 7489069

я посмотрел это решение
и получается что сейчас речь идет о min() + group by vs order by по скорости
неужели группировка дороже, чем сортировка???

**************

ещё в интернете почитал по моему случаю советуют вместо id in (select id использовать джоины типа такого

Код: sql
1.
select * from a where id in (select id from b);



vs

Код: sql
1.
select * from a join (select id from b) t on a.id = b.id;



мотивируют так, что в первом случае происходит использование неиндексированной временной таблицы, а во втором индексированной. как считаете врут или правду говорят??
...
Рейтинг: 0 / 0
05.09.2014, 23:40:09
    #38739143
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct update
Lumixещё в интернете почитал по моему случаю советуют вместо id in (select id использовать джоины типа такого



кстати, как оказалось об этом не только в интернете пишут и тут на форуме про это есть специальный фак про in (select
вот ссылка 7488749
...
Рейтинг: 0 / 0
05.09.2014, 23:44:15
    #38739145
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct update
Lumixещё в интернете почитал по моему случаю советуют вместо id in (select id использовать джоины типа такого
Код: sql
1.
select * from a where id in (select id from b);


vs
Код: sql
1.
select * from a join (select id from b) t on a.id = b.id;


мотивируют так, что в первом случае происходит использование неиндексированной временной таблицы, а во втором индексированной. как считаете врут или правду говорят??Советуют правильно, но аргументация другая. В версиях MySQL до 5.6 оптимизатор не понимал, что подзапрос в IN (SELECT ...) некореллированный, и в результате выполнял его не один раз, а столько, сколько раз его надо проверить. Насчет MariaDB я не в курсе.
...
Рейтинг: 0 / 0
06.09.2014, 01:15:20
    #38739174
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct update
miksoftВ версиях MySQL до 5.6 оптимизатор не понимал, что подзапрос в IN (SELECT ...) некореллированный, и в результате выполнял его не один раз, а столько, сколько раз его надо проверить. Насчет MariaDB я не в курсе.

ок, буду знать
я попрошу этот вопрос обсудить с заказчиком, может они смогут поставить 5.6 или свежее, чтобы у них работало быстрее
но эта функция все равно работает не в потоковом режиме, а вызывается изредко, когда им надо пересчитать целостную картину и поэтому она вызывается от силы пару раз в мес и в принципе они готовы ждать несколько секунд им пофиг...
...
Рейтинг: 0 / 0
06.09.2014, 01:31:08
    #38739179
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct update
Lumixможет они смогут поставить 5.6 или свежее, чтобы у них работало быстрееДля начала просто посмотрите план запроса. Возможно, это уже пофиксено.
...
Рейтинг: 0 / 0
06.09.2014, 08:31:15
    #38739214
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct update
miksoftLumixможет они смогут поставить 5.6 или свежее, чтобы у них работало быстрееДля начала просто посмотрите план запроса. Возможно, это уже пофиксено.

так вроде explain update только с 5.6 появился... в ранних версиях его же нету...
...
Рейтинг: 0 / 0
06.09.2014, 11:04:18
    #38739248
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Distinct update
Lumixmiksoftпропущено...
Для начала просто посмотрите план запроса. Возможно, это уже пофиксено.

так вроде explain update только с 5.6 появился... в ранних версиях его же нету...Ничего не мешает переправить на SELECT.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Distinct update / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]