|
|
|
Вернуть только не существующие записи
|
|||
|---|---|---|---|
|
#18+
Есть список значений в приложении например ('a', 'b', 'c'), есть таблица в MySQL с значениями ('c', 'd', 'e') Нужно из приложения передать список в базу, что-бы в результате вернулись только те значения которых нету в базе, то есть ('a', 'b'). По факту это вычитание множеств, как осуществить подобное на MySQL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 00:09:18 |
|
||
|
Вернуть только не существующие записи
|
|||
|---|---|---|---|
|
#18+
Нашёл способ: Код: sql 1. только как вместо union select 'b' union select 'c' сделать что-то типо ('a', 'b', 'c') ?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 00:38:55 |
|
||
|
Вернуть только не существующие записи
|
|||
|---|---|---|---|
|
#18+
fedddПо факту это вычитание множеств, как осуществить подобное на MySQL На MySQL этого нельзя осуществить, потому что DB это не множество и не вычитание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 01:24:48 |
|
||
|
Вернуть только не существующие записи
|
|||
|---|---|---|---|
|
#18+
Епрст, что значит not in ('c','d','e'); То и значит - два ваших "множества", а именно вся таблица или сколько их там и ваши данные будут умножены друг на друга теоретически столько раз, сколько там в общем получится элементов. Подумайте как можно сделать без not in, как построить запрос с равенством, на in. exist и тп. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 01:34:16 |
|
||
|
Вернуть только не существующие записи
|
|||
|---|---|---|---|
|
#18+
Как бы объяснить. Представьте два круга нарисованных на сетке пикселов в двух слоях. Совмещаем - круги пересекаются и вы говорите: множества складываются. Типа то, что не пересеклось - результат, типа вычитание. Однако что это было в сущности? Вы совместили по _ОДИНАКОВЫМ_ координатам пикселы двух картинок. Все пикселы были разные, а координаты у некоторых совпали. Чтобы повторить такую штуку в БД придется порушить саму суть БД - отсуствие адресов, координат, смещений и прочей программистской тряхомудии. Ну то есть у вас есть данные - скажем числа 1, 34, 4503, и 508383. Чтобы сделать из них "множество" надо просто выделить кучу памяти и записать 1 по адресам (ячейкам памяти) 1, 34, 4503, и 508383 и вот тогда повторяя этот метод для других данных вы немедленно узнаете каких значений в массиве А нет в массиве Б. Потому что записывая 1 по адресу 98274 получите либо 0 - там уже была 1, либо 1 - там не было единицы. Но все это _никакого_ отношения к БД не имает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 01:49:24 |
|
||
|
Вернуть только не существующие записи
|
|||
|---|---|---|---|
|
#18+
Нет кнопки редактировать. Чтобы найти чего нет, сначала надо найти то, что есть. Отметить как-то и тогда все что не отмечено будет тем, чего не было там, где оно есть. Или типа того. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 01:52:24 |
|
||
|
Вернуть только не существующие записи
|
|||
|---|---|---|---|
|
#18+
feddd, Варианты: Код: sql 1. 2. 3. Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 02:21:00 |
|
||
|
Вернуть только не существующие записи
|
|||
|---|---|---|---|
|
#18+
miksoft, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 07:38:34 |
|
||
|
Вернуть только не существующие записи
|
|||
|---|---|---|---|
|
#18+
Капец, промухнулся и отпостил NULL. Конечно можно заставить драйвер бд делать то же самое, что делает программист сталкивающийся с задачей выяснить "разницу" двух массивов. Ну и будет привод клацать циклами достигая декартова произведения до морковкиного заговения. в т1 есть 1 2 3 в т2 есть 4 5 6 фор ич а т1 фор ич б т2 с(аб) = (а == б) сколько будет циклов и каков будет результат? и зачем тогда мучиться запросами, если в стопицот раз проще сгрузить данные с бд и в процедурах спокойно все выяснить. Очевидно же это ремонт. А если не ремонт, если так работа устроена - это диагноз. Обычно такое возникает с репликацией которая не была предусмотрена. Есть две табли с совершенно одинаковыми данными в ключах. Оператор осмотром находит какие-то критерии отбора кроме ключей и решает построить _такой_ запрос, который вернет кучу неопределенности, то есть NULL'ей. Если это оно, можно не скачивать, наоборот - закачивать. INSERT ... ON DUPLICATE KEY UPDATE и перечислить что надо обновлять если id = values(id), а что добавлять если не равно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 07:53:11 |
|
||
|
Вернуть только не существующие записи
|
|||
|---|---|---|---|
|
#18+
debloggerКапец, промухнулся и отпостил NULL. Конечно можно заставить драйвер бд делать то же самое, что делает программист сталкивающийся с задачей выяснить "разницу" двух массивов. Ну и будет привод клацать циклами достигая декартова произведения до морковкиного заговения. в т1 есть 1 2 3 в т2 есть 4 5 6 фор ич а т1 фор ич б т2 с(аб) = (а == б) сколько будет циклов и каков будет результат? и зачем тогда мучиться запросами, если в стопицот раз проще сгрузить данные с бд и в процедурах спокойно все выяснить. Очевидно же это ремонт. А если не ремонт, если так работа устроена - это диагноз. Обычно такое возникает с репликацией которая не была предусмотрена. Есть две табли с совершенно одинаковыми данными в ключах. Оператор осмотром находит какие-то критерии отбора кроме ключей и решает построить _такой_ запрос, который вернет кучу неопределенности, то есть NULL'ей. Если это оно, можно не скачивать, наоборот - закачивать. INSERT ... ON DUPLICATE KEY UPDATE и перечислить что надо обновлять если id = values(id), а что добавлять если не равно. На самом деле не проблема загрузить данные из БД в программу и там уже их обработать, более того это проще и подобное я бы мог сделать с ходу, но подумал "а можно ли подобное организовать средствами БД"? Возможно БД данное действие сделает лучше чем я, хотя на этот счёт я не уверен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 09:54:02 |
|
||
|
Вернуть только не существующие записи
|
|||
|---|---|---|---|
|
#18+
debloggerциклами достигая декартова произведенияНе будет там никакого декартового произведения, не выдумывайте. Три раза в индекс слазить - не вижу проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 12:55:12 |
|
||
|
Вернуть только не существующие записи
|
|||
|---|---|---|---|
|
#18+
miksoft, Ну да, попроще будет, не суть в этом. Суть в том, что систематически таких задач возникать не должно. На разовые случаи париться запросами нет смысла. Выкачал, привел в порядок, там все нафик вычистил и по-новой закачал. Самое смешное что поскольку скуль это текст, задачу можно выполнить прямо в текстовом редакторе, ну, или в екзеле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 14:43:01 |
|
||
|
Вернуть только не существующие записи
|
|||
|---|---|---|---|
|
#18+
Применительно к бытовой практике такой запрос может означать например получить список жителей города которые НЕ проживают в доме 15 по ул. Ленина. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 14:46:06 |
|
||
|
Вернуть только не существующие записи
|
|||
|---|---|---|---|
|
#18+
debloggerПрименительно к бытовой практике такой запрос может означать например получить список жителей города которые НЕ проживают в доме 15 по ул. Ленина.Не обязательно так. Это может быть и получить список посетителей поликлиники, не проживающих по списку адресов (которые обслуживает поликлиника). А такой запрос уже вполне имеет право на жизнь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 14:54:11 |
|
||
|
Вернуть только не существующие записи
|
|||
|---|---|---|---|
|
#18+
И конечно вдумайтесь в постановку вопроса. Как вернуть несуществующие записи? В типовом сценарии получения/сохранения настроек предусмотрено значение по умолчанию. Например getSettings(key, default); Если такого ключа нет - получите взад то, что подали вперед. Если такой ключ есть - получите значение которое может отличаться от default. Это отличие и есть ключ. Допустим мы нашли поле в двух таблицах значения которых могут быть одинаковые. Значит поставив знак равенства в условии запроса WHERE t.somefield = t2.somefield мы получим таблицу в которой есть все что есть в обоих. Теперь добавляем в этот запрос какую-нить инфу и вместо силект пишем убдейт: ... SET t1.controlfield = 1, t2.controlfield = 1 WHERE t.somefield = t2.somefield; Теперь достаточно запросить WHERE controlfield = NULL и мы получим все "несуществующие" записи. Если в таблицах нет подходящего поля чтобы поставить метки - создать такое поле, затем убить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 15:01:39 |
|
||
|
Вернуть только не существующие записи
|
|||
|---|---|---|---|
|
#18+
miksoftНе обязательно так. Это может быть и получить список посетителей поликлиники, не проживающих по списку адресов (которые обслуживает поликлиника). А такой запрос уже вполне имеет право на жизнь. Короче тут видимо пресловутая теория несуществования пустила глубокие корни. Такой запрос имеет право на жизнь: получить список всех кто пользуется услугами и живет в по обслуживаемым адресам и поставить им галочку "наш". Тогда все кто в него не попал по умолчанию станут "не наш". Запрашиваем все строки где "наш" = NULL, печатаем и несем начальству. Любое несуществование это существование в другой ипостаси. Вы нарочно уменьшили масштаб изображения чтобы приблизить задачу к практически решаемой. А так: SELECT * FROM worldbears WHERE bearbrand != "Zhigulevskoe"; Уже было, вроде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 15:14:43 |
|
||
|
Вернуть только не существующие записи
|
|||
|---|---|---|---|
|
#18+
Блин, не bear, но beer. В общем пиво, а не медведь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 15:15:54 |
|
||
|
Вернуть только не существующие записи
|
|||
|---|---|---|---|
|
#18+
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 и мы получим все "несуществующие" записи. Если в таблицах нет подходящего поля чтобы поставить метки - создать такое поле, затем убить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 15:20:15 |
|
||
|
Вернуть только не существующие записи
|
|||
|---|---|---|---|
|
#18+
feddd, задача-то решена или еще нет:)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 15:33:26 |
|
||
|
Вернуть только не существующие записи
|
|||
|---|---|---|---|
|
#18+
Программист отстаивает свое право на жизнь в бд. Тут ничего не поделаешь, "стаж". авторБлеск! И что, одной командой вы обновите сразу обе таблицы? Проще пареной репы. Не знаю что вам надо подтянуть, но хотел бы попросить не гадить впредь. Пишите по существу. Так в чем проблема сразу 88 таблиц обновить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 15:34:49 |
|
||
|
Вернуть только не существующие записи
|
|||
|---|---|---|---|
|
#18+
debloggerПрограммист отстаивает свое право на жизнь в бд. Тут ничего не поделаешь, "стаж". авторБлеск! И что, одной командой вы обновите сразу обе таблицы? Проще пареной репы. Не знаю что вам надо подтянуть, но хотел бы попросить не гадить впредь. Пишите по существу. Так в чем проблема сразу 88 таблиц обновить?Жгите Шура! Только если можно - не голословно а с примером на MySQL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 15:54:40 |
|
||
|
Вернуть только не существующие записи
|
|||
|---|---|---|---|
|
#18+
Поправочка - с работающим примером на MySQL Ну или еще в какой-нибудь СУБД, если с MySQL вдруг не получится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 15:56:42 |
|
||
|
Вернуть только не существующие записи
|
|||
|---|---|---|---|
|
#18+
Блин, во я тормоз... Забыл, что debloggerскуль это текст, задачу можно выполнить прямо в текстовом редакторе, ну, или в екзеле.Ну а в СУБД кроме Word/Excel - можно ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 15:58:31 |
|
||
|
Вернуть только не существующие записи
|
|||
|---|---|---|---|
|
#18+
Опаньки... Был неправ, приношу извинения... Код: sql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 16:13:09 |
|
||
|
Вернуть только не существующие записи
|
|||
|---|---|---|---|
|
#18+
Интересно какую траву нынче жуют программисты? Cygapb-007Поправочка - с работающим примером на MySQL Ну или еще в какой-нибудь СУБД, если с MySQL вдруг не получится Так видно? Это я НЕ для вас. Для тех кто таких как вы начитается и начинает портить себе жизнь. Таблицы не абы какие, с нормальным автоинкрементами и примари. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Все, можно дропать или еще какую услугу оказать вам надо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2013, 16:19:52 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38352459&tid=1836332]: |
0ms |
get settings: |
10ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
59ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
| others: | 216ms |
| total: | 392ms |

| 0 / 0 |
