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


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

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

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

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

Код: 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
Distinct update
    #38738955
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решение найдно...

Код: 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
Distinct update
    #38738993
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Distinct update
    #38739026
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Distinct update
    #38739029
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

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

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

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

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

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

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

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

я в версиях особо не секу, но данное решение было сдано на MariaDB-5.5.38
...
Рейтинг: 0 / 0
Distinct update
    #38739142
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Distinct update
    #38739143
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixещё в интернете почитал по моему случаю советуют вместо id in (select id использовать джоины типа такого



кстати, как оказалось об этом не только в интернете пишут и тут на форуме про это есть специальный фак про in (select
вот ссылка 7488749
...
Рейтинг: 0 / 0
Distinct update
    #38739145
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Distinct update
    #38739174
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftВ версиях MySQL до 5.6 оптимизатор не понимал, что подзапрос в IN (SELECT ...) некореллированный, и в результате выполнял его не один раз, а столько, сколько раз его надо проверить. Насчет MariaDB я не в курсе.

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

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

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


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