powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вернуть только не существующие записи
34 сообщений из 34, показаны все 2 страниц
Вернуть только не существующие записи
    #38352271
feddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть список значений в приложении например ('a', 'b', 'c'), есть таблица в MySQL с значениями ('c', 'd', 'e')
Нужно из приложения передать список в базу, что-бы в результате вернулись только те значения которых нету в базе, то есть ('a', 'b'). По факту это вычитание множеств, как осуществить подобное на MySQL
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38352291
feddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашёл способ:
Код: sql
1.
SELECT * FROM (SELECT 'a' as charfil union select 'b' union select 'c') as table1 where table1.id not in ('c','d','e');


только как вместо union select 'b' union select 'c' сделать что-то типо ('a', 'b', 'c') ??
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38352318
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fedddПо факту это вычитание множеств, как осуществить подобное на MySQL

На MySQL этого нельзя осуществить, потому что DB это не множество и не вычитание.
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38352323
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Епрст, что значит not in ('c','d','e');

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

Подумайте как можно сделать без not in, как построить запрос с равенством, на in. exist и тп.
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38352328
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как бы объяснить. Представьте два круга нарисованных на сетке пикселов в двух слоях. Совмещаем - круги пересекаются и вы говорите: множества складываются. Типа то, что не пересеклось - результат, типа вычитание.

Однако что это было в сущности? Вы совместили по _ОДИНАКОВЫМ_ координатам пикселы двух картинок. Все пикселы были разные, а координаты у некоторых совпали. Чтобы повторить такую штуку в БД придется порушить саму суть БД - отсуствие адресов, координат, смещений и прочей программистской тряхомудии.

Ну то есть у вас есть данные - скажем числа 1, 34, 4503, и 508383. Чтобы сделать из них "множество" надо просто выделить кучу памяти и записать 1 по адресам (ячейкам памяти) 1, 34, 4503, и 508383 и вот тогда повторяя этот метод для других данных вы немедленно узнаете каких значений в массиве А нет в массиве Б. Потому что записывая 1 по адресу 98274 получите либо 0 - там уже была 1, либо 1 - там не было единицы.

Но все это _никакого_ отношения к БД не имает.
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38352330
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет кнопки редактировать. Чтобы найти чего нет, сначала надо найти то, что есть. Отметить как-то и тогда все что не отмечено будет тем, чего не было там, где оно есть. Или типа того. :)
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38352331
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
feddd,

Варианты:
Код: sql
1.
2.
3.
SELECT table1.id
FROM (SELECT 'a' as id union all select 'b' union all select 'c') as table1
WHERE NOT EXISTS (SELECT NULL FROM mytable WHERE mytable.id=table1.id)

Код: sql
1.
2.
3.
4.
SELECT table1.id
FROM (SELECT 'a' as id union all select 'b' union all select 'c') as table1
  LEFT JOIN mytable ON table1.id=mytable.id
WHERE mytable.id IS NULL
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38352366
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38352372
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Капец, промухнулся и отпостил NULL. Конечно можно заставить драйвер бд делать то же самое, что делает программист сталкивающийся с задачей выяснить "разницу" двух массивов. Ну и будет привод клацать циклами достигая декартова произведения до морковкиного заговения.


в т1 есть 1 2 3
в т2 есть 4 5 6

фор ич а т1
фор ич б т2
с(аб) = (а == б)

сколько будет циклов и каков будет результат? и зачем тогда мучиться запросами, если в стопицот раз проще сгрузить данные с бд и в процедурах спокойно все выяснить. Очевидно же это ремонт. А если не ремонт, если так работа устроена - это диагноз.

Обычно такое возникает с репликацией которая не была предусмотрена. Есть две табли с совершенно одинаковыми данными в ключах. Оператор осмотром находит какие-то критерии отбора кроме ключей и решает построить _такой_ запрос, который вернет кучу неопределенности, то есть NULL'ей.

Если это оно, можно не скачивать, наоборот - закачивать. INSERT ... ON DUPLICATE KEY UPDATE и перечислить что надо обновлять если id = values(id), а что добавлять если не равно.
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38352459
feddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
debloggerКапец, промухнулся и отпостил NULL. Конечно можно заставить драйвер бд делать то же самое, что делает программист сталкивающийся с задачей выяснить "разницу" двух массивов. Ну и будет привод клацать циклами достигая декартова произведения до морковкиного заговения.


в т1 есть 1 2 3
в т2 есть 4 5 6

фор ич а т1
фор ич б т2
с(аб) = (а == б)

сколько будет циклов и каков будет результат? и зачем тогда мучиться запросами, если в стопицот раз проще сгрузить данные с бд и в процедурах спокойно все выяснить. Очевидно же это ремонт. А если не ремонт, если так работа устроена - это диагноз.

Обычно такое возникает с репликацией которая не была предусмотрена. Есть две табли с совершенно одинаковыми данными в ключах. Оператор осмотром находит какие-то критерии отбора кроме ключей и решает построить _такой_ запрос, который вернет кучу неопределенности, то есть NULL'ей.

Если это оно, можно не скачивать, наоборот - закачивать. INSERT ... ON DUPLICATE KEY UPDATE и перечислить что надо обновлять если id = values(id), а что добавлять если не равно.

На самом деле не проблема загрузить данные из БД в программу и там уже их обработать, более того это проще и подобное я бы мог сделать с ходу, но подумал "а можно ли подобное организовать средствами БД"? Возможно БД данное действие сделает лучше чем я, хотя на этот счёт я не уверен
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38352796
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
debloggerциклами достигая декартова произведенияНе будет там никакого декартового произведения, не выдумывайте. Три раза в индекс слазить - не вижу проблемы.
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38353063
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

Ну да, попроще будет, не суть в этом. Суть в том, что систематически таких задач возникать не должно. На разовые случаи париться запросами нет смысла. Выкачал, привел в порядок, там все нафик вычистил и по-новой закачал. Самое смешное что поскольку скуль это текст, задачу можно выполнить прямо в текстовом редакторе, ну, или в екзеле.
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38353074
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Применительно к бытовой практике такой запрос может означать например получить список жителей города которые НЕ проживают в доме 15 по ул. Ленина.
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38353098
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
debloggerПрименительно к бытовой практике такой запрос может означать например получить список жителей города которые НЕ проживают в доме 15 по ул. Ленина.Не обязательно так. Это может быть и получить список посетителей поликлиники, не проживающих по списку адресов (которые обслуживает поликлиника). А такой запрос уже вполне имеет право на жизнь.
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38353117
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И конечно вдумайтесь в постановку вопроса. Как вернуть несуществующие записи?

В типовом сценарии получения/сохранения настроек предусмотрено значение по умолчанию. Например

getSettings(key, default);

Если такого ключа нет - получите взад то, что подали вперед. Если такой ключ есть - получите значение которое может отличаться от default. Это отличие и есть ключ.

Допустим мы нашли поле в двух таблицах значения которых могут быть одинаковые. Значит поставив знак равенства в условии запроса WHERE t.somefield = t2.somefield мы получим таблицу в которой есть все что есть в обоих.

Теперь добавляем в этот запрос какую-нить инфу и вместо силект пишем убдейт: ... SET t1.controlfield = 1, t2.controlfield = 1 WHERE t.somefield = t2.somefield;

Теперь достаточно запросить WHERE controlfield = NULL и мы получим все "несуществующие" записи.

Если в таблицах нет подходящего поля чтобы поставить метки - создать такое поле, затем убить.
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38353151
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftНе обязательно так. Это может быть и получить список посетителей поликлиники, не проживающих по списку адресов (которые обслуживает поликлиника). А такой запрос уже вполне имеет право на жизнь.

Короче тут видимо пресловутая теория несуществования пустила глубокие корни.

Такой запрос имеет право на жизнь: получить список всех кто пользуется услугами и живет в по обслуживаемым адресам и поставить им галочку "наш". Тогда все кто в него не попал по умолчанию станут "не наш". Запрашиваем все строки где "наш" = NULL, печатаем и несем начальству.

Любое несуществование это существование в другой ипостаси.

Вы нарочно уменьшили масштаб изображения чтобы приблизить задачу к практически решаемой.

А так: SELECT * FROM worldbears WHERE bearbrand != "Zhigulevskoe";

Уже было, вроде.
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38353156
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, не bear, но beer. В общем пиво, а не медведь.
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38353170
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
debloggerfedddПо факту это вычитание множеств, как осуществить подобное на MySQL

На MySQL этого нельзя осуществить, потому что DB это не множество и не вычитание.Эта пять:)
http://www.ods.com.ua/win/rus/db/osbd/glava_20.htm Общая интерпретация реляционных операцийОтношение, являющееся разностью двух отношений включает все кортежи, входящие в отношение - первый операнд, такие, что ни один из них не входит в отношение, являющееся вторым операндом. Основы надо подтянуть, все же :)debloggerКак бы объяснить. Представьте два круга нарисованных на сетке пикселов в двух слоях. Совмещаем - круги пересекаются и вы говорите: множества складываются. Типа то, что не пересеклось - результат, типа вычитание.

Однако что это было в сущности? Вы совместили по _ОДИНАКОВЫМ_ координатам пикселы двух картинок. Все пикселы были разные, а координаты у некоторых совпали. Чтобы повторить такую штуку в БД придется порушить саму суть БД - отсуствие адресов, координат, смещений и прочей программистской тряхомудии.Тихо шифером шурша
Крыша едет не спеша...Ну то есть у вас есть данные - скажем числа 1, 34, 4503, и 508383. Чтобы сделать из них "множество" надо просто выделить кучу памяти и записать 1 по адресам (ячейкам памяти) 1, 34, 4503, и 508383 и вот тогда повторяя этот метод для других данных вы немедленно узнаете каких значений в массиве А нет в массиве Б. Потому что записывая 1 по адресу 98274 получите либо 0 - там уже была 1, либо 1 - там не было единицы.

Но все это _никакого_ отношения к БД не имает.И ведь таки прав - действительно вся эта муть к БД никакого отношения не имеет...
Жесть... debloggerВыкачал, привел в порядок, там все нафик вычистил и по-новой закачал. Самое смешное что поскольку скуль это текст , задачу можно выполнить прямо в текстовом редакторе, ну, или в екзеле.Шикааарно нафига вам СУБД, юзайте WORD и будьте счастливы...
Жгите дальше, давно так не смеялся

О. пока писал - новый перл :)
debloggerИ конечно вдумайтесь в постановку вопроса. Как вернуть несуществующие записи?Не просто несуществующие, а несуществующие во второй таблице, или во втором "множестве", но вы это по обыкновению игнорируете, это ладно...В типовом сценарии получения/сохранения настроек предусмотрено значение по умолчанию. Например

getSettings(key, default);

Если такого ключа нет - получите взад то, что подали вперед. Если такой ключ есть - получите значение которое может отличаться от default. Это отличие и есть ключ.

Допустим мы нашли поле в двух таблицах значения которых могут быть одинаковые. Значит поставив знак равенства в условии запроса WHERE t.somefield = t2.somefield мы получим таблицу в которой есть все что есть в обоих.

Теперь добавляем в этот запрос какую-нить инфу и вместо силект пишем убдейт: ... SET t1.controlfield = 1, t2.controlfield = 1 WHERE t.somefield = t2.somefield;
Блеск! И что, одной командой вы обновите сразу обе таблицы?
Жгите еще, плз!! Теперь достаточно запросить WHERE controlfield = NULL и мы получим все "несуществующие" записи.

Если в таблицах нет подходящего поля чтобы поставить метки - создать такое поле, затем убить.
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38353195
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
feddd, задача-то решена или еще нет:)?
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38353198
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программист отстаивает свое право на жизнь в бд. Тут ничего не поделаешь, "стаж".

авторБлеск! И что, одной командой вы обновите сразу обе таблицы?

Проще пареной репы.

Не знаю что вам надо подтянуть, но хотел бы попросить не гадить впредь. Пишите по существу.

Так в чем проблема сразу 88 таблиц обновить?
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38353241
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
debloggerПрограммист отстаивает свое право на жизнь в бд. Тут ничего не поделаешь, "стаж".

авторБлеск! И что, одной командой вы обновите сразу обе таблицы?

Проще пареной репы.

Не знаю что вам надо подтянуть, но хотел бы попросить не гадить впредь. Пишите по существу.

Так в чем проблема сразу 88 таблиц обновить?Жгите Шура! Только если можно - не голословно а с примером на MySQL
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38353248
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправочка - с работающим примером на MySQL
Ну или еще в какой-нибудь СУБД, если с MySQL вдруг не получится
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38353252
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, во я тормоз... Забыл, что
debloggerскуль это текст, задачу можно выполнить прямо в текстовом редакторе, ну, или в екзеле.Ну а в СУБД кроме Word/Excel - можно ?
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38353285
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опаньки... Был неправ, приношу извинения...
Код: sql
1.
2.
update MyTable t, MyTable2 t2 set t.t=1, t2.t=1
where t2.c=t.c
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38353293
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно какую траву нынче жуют программисты?

Cygapb-007Поправочка - с работающим примером на MySQL
Ну или еще в какой-нибудь СУБД, если с MySQL вдруг не получится

Так видно?

Это я НЕ для вас. Для тех кто таких как вы начитается и начинает портить себе жизнь.

Таблицы не абы какие, с нормальным автоинкрементами и примари.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE IF NOT EXISTS `Tab1`(
  `id_t1` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Таблица1` varchar(255) NOT NULL,
  PRIMARY KEY (`id_t1`)
);

CREATE TABLE IF NOT EXISTS `Tab2`(
  `id_t2` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Таблица2` varchar(255) NOT NULL,
  PRIMARY KEY (`id_t2`)
);



Все, можно дропать или еще какую услугу оказать вам надо?
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38353297
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В том и дело что описанная задача НЕ подразумевает иерархических связей, структура таблиц одинаковая, стало быть все кроме INSERT'а можно делать синхронно хоть с 888 таблями.
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38353305
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
debloggerВ том и дело что описанная задача НЕ подразумевает иерархических связей, структура таблиц одинаковая, стало быть все кроме INSERT'а можно делать синхронно хоть с 888 таблями.Судя по докам - да... Хотя механизм сего чуда ... непонятен... :) Равно как и блокировки таблиц...

Надо будет почитать на досуге...
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38353309
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы лучше подскажите как не создавая колонки отметить поля. В башке крутится не могу сообразить. Должно быть через индексы. Типа выкосить все и добавить только тем, которые совпадают.
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38353320
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007Судя по докам - да... Хотя механизм сего чуда ... непонятен... :) Равно как и блокировки таблиц...


Как я и предполагал тут стаж сурового такого, челябинского программирования.

Нет никакого чуда. Странно почему одновременный инсерт недопустим. Видимо какое-то железное ограничение, типа какой тогда id возвращать.

На практике, конечно, все это редко используется, поскольку обновлять иерархию из плоского отчета в принципе можно, но геморройно и логически несовместимо с иерархией.

Однако это вовсе не значит что вам нельзя соединить абсолютно любым таблицы таким простым способом

SELECT tab1, tab3 WHERE 1

Ни разу не пробовали?

Кроме того, это полная квалификация идентификаторов. Я специально сделал такие таблицы для примера с индивидуальными названиями полей. Чтобы не трахаться с выбором их в SELECT. Но если надо то пишем по схеме: база.таблица.поле Каждое поле таким образом идентифицируется однозначно и почему это чудо я не понял.
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38353324
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня фигня какая-то получается:)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create table MyTable(val varchar(100));
insert MyTable values 
  ('abb'),('abc'),('ac'),('b');

set @str='a,ab,abc,b,ac';

select @str:=replace(concat(',',@str,','),concat(',',t.val,','),',')
from MyTable t
where FIND_IN_SET(t.val,@str)>0;

select @str;


Но в конце получается ',,,a,ab,,,' , да и индекс не пристегивается - полным перебором получается:(
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38353341
feddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007feddd, задача-то решена или еще нет:)?
Как хотелось решить - нет, не решена. Вариант с множеством union некрасив и в данном случае бессмысленный.
Решено в лоб, извлекаю селектом все записи из таблицы в программе, помещаю все данные в хеш(т.к. дублироваться они не могут) и проверяю имеющийся записи на наличия такого ключа в хеше.
Красивого решения в виде у меня нету: дать в БД список -> получить значения, которых нету в определённой таблице.
На первый взгляд довольно тривиальная задача, удивлён, что так и не удалось найти красивого решения.
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38353344
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
впрочем, все поправимо (пока - кроме индекса)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
set @str='a,ab,abc,b,ac';
set @str=concat(',',@str,',');

select @str:=replace(@str,concat(',',t.val,','),',')
from MyTable t
where FIND_IN_SET(t.val,@str)>0;

select substr(@str,2,length(@str)-2);
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38353531
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007впрочем, все поправимо (пока - кроме индекса)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
set @str='a,ab,abc,b,ac';
set @str=concat(',',@str,',');

select @str:=replace(@str,concat(',',t.val,','),',')
from MyTable t
where FIND_IN_SET(t.val,@str)>0;

select substr(@str,2,length(@str)-2);



В суть топика -- не вникал, но межет
вот такая мулька вам поможет:

http://www.sql.ru/forum/740218/zapros-vypolnyaetsya-25-sek?mid=8434456#8434456
...
Рейтинг: 0 / 0
Вернуть только не существующие записи
    #38353562
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbc,

В общем-то как раз и думал о подобном, только с нумерацией через переменные (типа: select @n:=@n+1, * from table1,(select @n:=0)n order by ...) и соединением сформированной динамически таблички с основной.

Но - если у таблицы нет нужного индекса, или если решение ТСа не устраивает, - то и напрягаться не стоит
...
Рейтинг: 0 / 0
34 сообщений из 34, показаны все 2 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вернуть только не существующие записи
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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