Литература: - Прибыл Фейерштейн. Oracle PL/SQL. Для профессионалов - если уметь исказть, можно найти бесплатно без СМС и на русском. - Алан Бьюли. Изучаем SQL. - про MySQL, тоже легко находится. Довольно старая, но базовые вещи не сильно меняются. - К. Дж. Дейт. Введение в системы баз данных - талмуд на овер 1000 страниц. - Томас Кайт. Oracle для профессионалов - тоже талмуд.
Q: Что лучше, SQL или NoSQL? A: Как обычно, зависит от задач. Нужна любой ценой скорость - бери NoSQL, нужна согласованность данных - SQL. У всего свои плюсы и минусы, и в обозримом будущем ни один подход не заменит другой полностью.
Q: Вопросы с лабами и задачками A: Смело спрашивай, с вероятностью больше 50% ответят, но могут и обоссать.
Здесь мы: - Негодуем, почему шапка - говно, и предлагаем коллективному ОПу идеи, как её улучшить. - Разбираемся, почему PostgreSQL - не Oracle - Пытаемся понять, зачем нужен Тырпрайс, если есть бесплатный опенсурс - Обсуждаем, какие новые тенденции хранения данных появляются в современном цифровом обеществе - Решаем всем тредом лабы для заплутавших студентов и задачки с sql-ex для тех, у кого завтра ПЕРВОЕ собеседование - Анализируем, как работает поиск вконтакте - И просто хорошо проводим время, обсирая чужой код, не раскрывая, как писать правильно
Аноны, шо на пиндоском можно почитать, а то >SQL: - https://www.w3schools.com/sql/ хуже гайдов с метанита, но чет я теряюсь в метаните, там просто все прочесть?
У нас один программер начитался книжек по sql и решил, что нам точно нужно секционирование таблиц, чтобы ускориться. Как мне его мягко убедить, что у нас не те объемы и тормозит все из-за говнокода и кривой модели данных? Таблицы еще маленькие, по логике не имеет смысла, и врядли в ближайшие годы этот смысл понадобится но он потестил и с партицированием быстрее(( Или не париться и пусть делает, раз так хочет?
>>2228764 1. Бизнес готов давать деньги на "ковыряние в табличках"? Обычно средства на это выделяются, когда все нахуй падает или приходит запрос от клиента, что у вас все хуево. Тем более партиционирование повлечет еще немалые изменение в коде апликухи, что тоже бьет по карману бизнеса; 2. Сравни время выполнения через СУБД и через апликуху. Если все так, как ты написал, то есть смысл тогда ковыряться в коде.
Ты не прав. Мнения в треде не разделились. Они вообще не представляют собой какую-то выборку. Суть обсуждения в треде не позволяет делать выводы о количествах мнений. Это же не опрос каждого имеющего дело с базами данных. Люди публикуют мнение, когда видят, что ранее их мнение в треде еще не было представлено.
Вот в данном обсуждении взвешенный научный подход плохо представлен, поэтому я это и написал. И да, в тот момент когда программистишки совсем запутываются, они приходят ко мне.
>>2228764 Какой хороший программер. Если БД хоть немного склонна к росту, то заложить секционирование в модель данных - это ОЧЕНЬ хорошая практика. Ну и по-человечески, людей надо подбадривать. Если хочет человек что-то хорошее сделать и у него по остальным пунктам не полный безотлагательный пиздец, то пусть делает.
Есть таблица "события", в ней есть, помимо прочих, столбцы "район", "улица", "номер дома". Извлечь эти столбцы в таблицу "адреса событий", ссылающуюся на таблицу "события" - бест практис?
>>2230865 Ну улицу и район точно нужно извлекать, номер дома хз, т.к как справочная информация не особо имеет смысл, но с другой стороны оставлять в фактах так как есть, тоже не дело. Извлекайте, шура.
>>2230886 Ну и какую проблему ты решишь таким извлечением? Смысл был бы, если бы адрес был не у всех событий, а так при любых действиям с событиями придётся делать лишний джойн, писать один лишний инсерт/аплейт, ебаться с объединением данных на уровне приложения. Можно хоть для каждого столбца завести по таблице, чтобы они все форенкеились с таблицей событий, где единственный столбец - ID, но что это тебе даст?
А как быстро пробегать по базе типа Номер транзакции Отправитель Получатель Сумма 1 Кабан Сычев Сотыга 2 Сычев Пориджная 0.5сотыги 3 Кабан Сычев 0.5сотыги 4 Сычев Пориджная 0.3сотыги 5 Пориджная Кабан 0.8сотыг
чтобы узнать сколько денег у Кабана, Сычева и Пориджной?
select debit.debit_acc, credit.credit_amount - debit_amount balance from ( select debit_acc, sum(amount) debit_amount from trans debit group by debit_acc ) debit join ( select credit_acc, sum(amount) credit_amount from trans credit group by credit_acc ) credit on debit.debit_acc = credit.credit_acc;
>Можно хоть для каждого столбца завести по таблице, чтобы они все форенкеились с таблицей событий Ну так обычно в реляционных бд и делают, все кроме самих фактов выносят в отдельный справочник. Адрес это явно справочная информация.
В Postgresql есть таблица, в которой у каждой записи есть колонка created_ts - как могли догадаться это timestamp создания записи. На данный момент я создаю этот таймстемп внутри моего приложения и передаю с sql запросом INSTERT, есть ли способо добавлять таймстепм средствами постгрес?
И второй момент: у меня есть задача которая раз в час проходится по этой таблице и удаляет из нее все записи старше 90 минут (чтоб таблица не захламлялась старыми записями). Для этого сейчас на поле created_ts навешен обычный betree индекс, можно ли заюзать что-то более подходящее?
>>2232449 >insert into tab values (1,now()); так не можешь чтоль?
>можно ли заюзать что-то более подходящее?
Заюзывай, разрешаю. Узнать что же на самом деле подходит в твоем случае, тебе придется самому. Но ты можешь по своему зумерскому методу решения проблем копировать всякую хуйню с Двача и Stackoverflow. Давай. Мы ждем.
>>2232503 Суть вот в чем: есть таблица где хранятся: user_id, idem_key, created_ts Это (очевидно) айдишник юзера, ключ идемпотентности и таймстемп. Когда юзер проводит транзакцию на перевод внутренней валюты другому юзеру, мы сохраняем в таблице строчку с соответствующими данными, на пару (user_id, idem_key) установлен индекс уникальности, так что если сохранится вторая такая пара, БД выдаст ошибку которую обработает приложение - это сделано для избежания дублей запросов с клиента. Эту идею я подсмотрел спиздил из статейки https://habr.com/ru/company/yandex/blog/442762/ По факту туда можно прикрутить Редис, но как его использовать в таком случае? Как очищать устаревшие данные в кеше?
Сап, кто может пояснить за TRANSACTION ISOLATION LEVEL? Зачем нужны, где используются? И что по Rollback / commit? Нахуй это говно нужно? Никто же IMPLICIT_TRANSACTIONS ON не будет включать, чтобы играть с ролбэками. Или я чего-то не знаю?
>>2236274 Когда ты пердолишся таблицой как правило происходит её блокировка, чтоб пока ты читаешь/пишешь туда данных не напиахли для этого и нужен TRANSACTION ISOLATION LEVEL .
Их 4(или 6, в зависимости от реализпации): 1) READ UNCOMMITTED - читаем как есть ничё не лочим. Если кто-то вставляет/удаляет, можем прочитать хуйпойми что. 2) READ COMMITTED - лочим только строки которые читаем, чтоб их не изменили. 3) REPETABLE READ - это когда в рамках одной транзакции нам надо сделать несколько чтений, если уровень изоляции ниже этого условно каждый селект будет накладывать свою блокировку. При этом режиме блокировка действует в рамках всей транзакции. 4) SERIALIZABLE - накладывает блокировку на строки ПЛЮС запрещает делать инсерты в таблицу. Т.е. в п3 мы залочили строки, но если нам напихали инсертов, появились новый строки.
>>2236314 >>2236446 спасибо, но это я и так знал, я не понимаю реального применения. У меня есть несколько потребителей Sql базы (см. приложения), каждый из них делает по 200-300 CRUD реквестов в секунду, на каком они уровне это делают, READ COMMITTED? И хотел бы узнать хоть один реальный пример отказа транзакций. Единственное, что приходит на ум - это снятие дедлока/транзации с каскадным откатом (типо удаление зависимых данных).
>>2236922 > READ COMMITTED По дефолту обычно да, в ОРМ можно указать уровень изоляции.
>И хотел бы узнать хоть один реальный пример отказа транзакций 1) Запись большого блока данных, чем делать 100 инсертов, лучше сделать одну транзакцию и в рамках неё исполнить все инстерты, и если у нас один инсерт фейлится, отменяем всю транзакцию. 2) Надо записать связанные данные, с одного счета списать на другой положить.
>>2236922 ты блядь совсем тупой? прочитал 5 раз и ничего не понял? Представь ситуацию, когда ты два раза нажал в интернет-магазине кнопку Оплатить, а магазин писал такой тупень как ты и он исправно отправил два запроса в банк, но на карте у тебя только N денег, но товары стоят 2*N.
В базе есть колонка с UNIQUE - как делать так чтобы в случае если данные вставляются повторно, то БД просто шла бы дальше, не выбрасывая никаких ошибок?
У меня есть множество записей (Post) у каждого из которых есть набор тегов, как это все хранить в базе для быстрого доступа по тегам? РСУБД и искать через LIKE в строке? Mongo и делать то же самое? Или тут полнотекстный поиск с Эластиком нужен?
Сап, появилась псевдонеобходимость в postgres хранить набор ключ-значений с динамической структурой этих значений, читал про eav, хуйня хуйнёй. Благо в pg есть jsonb решил его и использовать.
Вопрос в том, как происходит обновление данных в этом jsonb. Если нужно обновить 1 значение, как поведёт себя субд - будет переписывать весь столбец или есть какой то механизм, позволяющий апдейтить только часть? Судя по описанию jsonb_set() нужно обновлять весь столбец, но всё же я надеюсь на второй вариант.
Аноны, пожалуйста, помогите! Ситуация проста я 0 айкью+экономист, препод положил на всю группу хуй. При любом вопросе отвечает загадкой, а запросы делать надо, а то будет незачет. Так что если пишу не правильно какие-то вещи, то прошу простить SQL Server, запросы звучат как: 1) Вывести средний срок доставки заказа для каждого месяца 2020 года. Заказ относим к месяцу по дате отправки. Соответственно названия строк date_order_dispatch(дата отправки заказа), date_order_accepted(дата принятия заказа), Таблица с заказами orders 2) Для каждого склада вывести количество ожидающих выдачи заказов Тут даже без понятия, что указывать, потому что есть просто таблица Склад, где только Название и Адрес
>>2245075 select trunc(дата отправления заказа,'mm'),avg(дата доставки на склад назначения-дата отправления заказа) from история перемещений where дата отправления заказа>to_date('01.01.2020','dd.mm.yyyy') and дата отправления заказа<to_date('01.01.2020','dd.mm.yyyy') group by trunc(дата отправления заказа,'mm')
попробуй вот эту хуйню переписать с нормальными названиями таблиц и полей.
select склад.номер склада,count(*) from склад join история перемещений on история перемещений.номер склада назначения=склад.номер склада left join выдача on склад.код адреса=выдача.код адреса выдачи and история перемещений.ID заказа=выдача.ID заказа where дата доставки на склад назначения<=sysdate and nvl(дата выдачи,sysdate+1)>sysdate group by склад.номер склада
>>2245083 >select trunc(дата отправления заказа,'mm'),avg(дата доставки на склад назначения-дата отправления заказа) from история перемещений where дата отправления заказа>to_date('01.01.2020','dd.mm.yyyy') and дата отправления заказа<to_date('01.01.2020','dd.mm.yyyy') group by trunc(дата отправления заказа,'mm') Не распознал trunc:(
>>2245087 >select >склад.номер склада,count(*) >from склад join история перемещений on история перемещений.номер склада назначения=склад.номер склада left join выдача on склад.код адреса=выдача.код адреса выдачи and история перемещений.ID заказа=выдача.ID заказа where дата доставки на склад назначения<=sysdate and nvl(дата выдачи,sysdate+1)>sysdate group by склад.номер склада nvl не распознает теперь
>>2245083 >>2245087 Ну ты мастер в такую пикчу врубиться, за что там код адреса отвечает в разных таблицах, моё увожение. Чувствуются годы энтерпраза и прокачанный libastral.so.
>>2245083 >>2245087 Так-то, анонче, спасибо большое, насчет ошибок буду до препода доебываться, вдруг поможет А тебе желаю счастья, здоровья и хорошо отдохнуть в отпуске!
>>2245096 >>2245099 >Не распознал trunc >nvl не распознает теперь Ну я в основном с ораклом работал поэтому и написал на оракле, гугли аналоги функций в твоей СУБД. >>2245100 > годы энтерпраза и прокачанный libastral.so. Полтора годика в банке всего. >>2245104 Скорее всего не проканает, функции выглядят как будто вернут буль а не значение, разые что через кейс переписывать. >>2245103 >насчет ошибок буду до препода доебываться Препод выкупит что запрос под другую среду написан и написал его не ты, шанс быть обоссанным огромен.
>>2227895 (OP) Всю голову уже сломал, потому как с SQL особо дела не имел никогда. Суть: есть таблица с полем Time (временная метка). От условного клиента приходит запрос на выборку записей с Time >= From и Time <= To. Первую и последнюю запись в этой выборке будем называть граничными, если Time == From или Time == To, иначе - внутренними (Time > From, Time < To). Также клиент передает флаг IncludeBounds, действующий следующим образом: если IncludeBounds == True и крайняя запись (первая или последняя) - внутренняя, то необходимо включить в выборку запись с временной меткой прямо перед ней/прямо после нее (для первой и последней записи соответственно). Диалект - PostgreSQL. Очень хочется выполнить всё это средствами запроса в SQL и не прекладывать фильтрацию крайних записей на клиента. С меня сотни нефти, если подскажете, в какую сторону смотреть. Видел оконные функции в мануале по pgsql типа lag и lead, но никак не могу ввернуть их в свою развесистую логику.
>>2247028 Вроде такие ебалы на sql не пишут, а обычно делают sql-запрос с вытягиванием данных в нужном формате для BI-тулзы типа Power BI Desktop. Есть ещё любители подушить своего питона с Pandas. Если нужен sql, то советую писать не сразу весь огромный запрос, а итеративно через кучу промежуточных представлений на with ... as... Например, сначала рассуй свою основную сущность, от которой всё производится (инфа о кредитах одного человека, видимо) по месяцам, потом на основе этого представления делай ещё представление с уже конкретно интересующей сущностью (взятый в этом месяце краткосрочный кредит по месяцам), потом ещё представление с нужными параметрами для рассчёта интересующего параметра (например, количество краткосрочных кредитов в месяц, если нужно посчитать их процент), потом на основе всего уже финалочку: месяц есть, размер когорты есть, количество краткосрочных кредитов за месяц есть, осталось посчитать процент. Ну ты понел идею, и постгресовская рекурсия не понадобится.
>>2247057 У меня чуть кишка не выпала писать простенькую рекурсию с пересечением периодов просрочки по одному контрагенту на разных сделках, тут логика сложнее, вообще ёбнуться можно.
>>2247063 Да, я так и думаю по кусочкам данные вытащить. После загнать их в Excel или Power BI. Power BI хорош, но у меня железо не может его переварить если там много данных.
>>2247909 В общем случае для каждого значения создаётся по новой записи в таблице: id | value 1 | 1 2 | 3 3 | 10 4 | 100 Ещё некоторые СУБД поддерживают коллекции в колонках (массивы, json и т.д.), но там есть свои проблемы.
Реквестирую гид для даунов, в котором будет описано, как на винде сделать синхронизацию между двумя базами данных. Я так понял, что это называется репликацией, но не нашел нормального пошагового гайда.
Хочу научиться создавать и приложения всякие, погромировать (только пайтон). Из того что умею, писать какие-то сложные SQL запросы с достаточно сложной логикой, с большим количеством данных, и с хуевым качеством модели данных, знаю о моделировании хранилищ данных для крупных предприятий, и разбираюсь немного в оптимизации, короче SQL аналитик. Какие подводные?
>>2248889 Для тебя - никак. Просто купи самый дорогой и большой сервер который можешь себе позволить. Не надо масштабировать СУБД (по крайней мере тебе)
>>2248999 Да в частности никаких подводных, за 2–3 месяца наглаживания питона сможешь свободно свои данные вертеть в каком-нибудь пандасе. Питон вообще нужен только для датасатанизма и говноскриптов. А вот для погромирования в целом тебе такая прорва знаний понадобится, что охуеть не встать, лучше сначала выбери один стул из трёх: десктоп, мобилки или веб. Ну и долби эту область до посинения, там везде фрактал технологий, на всю жизнь хватит. Если ты ради денег всё это затеял, выбирай жабаскрипт и веб, бонусом потом получишь говнокод на мобилках. И как языки javascript и python это два брата-акробата. Питон, конечно, лучше задизайнен, но склонность к говнокоду они развивают одинаковую. Если же погромировать хочется из любви к искусству, то я бы брал десктоп и дотнет, туда Хайльсберг натаскал столько фич из разных языков и парадигм, что потом сможешь перекатиться куда душе угодно и всё тебе будет казаться знакомым.
С фронта приходит список строк по типу ["maryland", "prowler", "twitterpluck"]
Мы выбираем из таблицы entity только те строки где name равняет одному из тех что оказались в списке. Как это правильно сделать? Ебануть switch-case? Какой-то индекс к колонке стоит добавлять?
>>2250278 select * from entity where name in ('maryland', 'prowler', 'twitterpluck') Для генерации списков такого вида и передачи их в запрос в твоём языке наверняка есть что-то готовое. Индекс по name, конечно, нужен.
доброго, аноны. решаю тут задачку одну и немного запутался.
цель - построить модель БД, отобразить связи между сущностям. задание такое - каждому студенту выдают базовый набор при поступлении на первый курс: один учебник по истории; один учебник по экономике; один учебник по высшей алгбере; один учебник по матанализу.
у каждого учебника есть индивидуальный номер из библиотеки и год выпуска книги.
Вопрос такой, какие связи тут использовать? изначально построил многие ко многим, но засомневался. сомневаюсь, потому что по сути один студент и одна книга по каждому предмету. не должно быть тут один ко одному? есть у кого какие мысли?
>>2251743 У тебя ведь есть в задаче индивидуальный номер учебника в библиотеке, это он и есть. Его можно было бы использовать как первичный ключ вместо book_copies.id, но если он не считается простым инкрементом счётчика и должен быть в определённом формате наподобие "2017/А/453-нд", лучше его хранить отдельно.
>>2249159 >Кстати, ты apache superset уже поставил? Зачем тебе вообще приложения писать, если есть apache superset ? А в чем связь?
>>2249625 >датасатанизма и говноскриптов Учитывая что я собственно и не умею писать говноскрипты и не работаю в пандасе, то думаю начать с этого, чтобы освоиться немного. Веб звучит интереснее
>>2251752 >"2017/А/453-нд" А в чем смысол таких названий? чтобы получать максимум информации просто взглянув на название, и знать к какому модулю программы это относится, или что? мимо
>>2251830 Подобные номера появились задолго до программирования, в каких-нибудь бумажных картотеках и документах часто такая нумерация, потому что нет удобной централизованной базы данных, которая бы нумеровала по счётчику, и приходится придумывать, как обеспечить уникальность номеров так, чтобы было более-менее удобно упорядочивать и искать. Такое юзается везде - учётные карточки в библиотеке, серия/номер паспорта, банковский счёт, номер телефона и т.д.
>>2251839 По-разному делают, не только для удобства. Часто там, где внедряют ПО, уже есть классический учёт на бумажках, и приходится для сохранения "обратной совместимости" добавлять его поддержку. Где бизнес-процесс организуется с нуля, иногда могут обойтись без этого.
>>2251839 >>2251845 В современых системах на TB+ данных такое внедряется специально, напирмер partitions в Hadoop (ага, зумеры переизобрели то что деды веками использовали...), что бы про селектах тянуть только нужные данные.
>>2251662 1. Таблица где все студенты 2. Таблица "виды учебников" 3. Таблица, где все учебники с номерами и ссылка на вид учебника 4. Таблица, где связано когда, кому и что выдано / возвращено. Ссылка на студента и ссылка на учебник.
С такой системой ты сможешь посчитать остатки учебников в библиотеке, узнать какие учебники на руках у конкретного студента в любой момент времени, узнать каких учебников студент недополучил/переполучил и т.д.
Добрый вечер, аноны. Встала задача оптимизировать долгие запросы с таймаутами, но опыта почти нет, кроме как собрать старую статистику, либо ебануть индекс. Подкиньте плиз разных книг по оптимизации запросов в бд oracle или индексов, желательно не совсем старье. В гугле много чего нашел, но может у анона завалялись хидден джемы о которых мало кто знает?
>>2255507 Нет, указание имени должно было работать, и хардкод айдишника с точки зрения читабельности - говнокод. Хуй знает что там за проблема, эта хреновина же нормальные сообщения об ошибках не выдает.
>>2255349 ты старьем называешь "Кэри Миллсап, Джефф Хольт. Oracle: Оптимизация производительности"? там вроде не поменялось нихуя. Как 20 лет назад он зумеров обоссывал и сейчас все актуально.
>>2255913 >Значение 1000000, указанное для параметра MAXRECURSION, превышает допустимый максимум 32767. MSSQL. Стек вызовов не бесконечный. Вроде в каких-то можно числовую последовательность функцией просто сгенерить. В postgres generate_series есть например.
Но я упор на быстроту делал.
А так переделал Having в краткий вариант c минимумом, вроде на секунду быстрее, показывает всегда 10 секунд так милионную последовательность. Но всё остальное оставил, как было. Так как так быстрее работать будет.
Надо рассматривать только цифры, которые оканчиваются на 1, 3, 7 или 9 и в условие соединения поставить делимость на 2 3 5 7. По этой причине лучше через UNION граничные условия отработать, так как числа 2 3 5 7 не попадут туда. А разница в производительности большая, если убрать это условие.
Еще числа надо проиндексировать, поместив во временную таблицу, так как оно потом само с собой соединяется. Я проверял, что при установке индекса на колонку с числом во временной таблице, где все числа лежат, быстрее в 1,5 раза работает. Без индекса 16 секунд, а с ним под 10.
>>2255839 >ты старьем называешь "Кэри Миллсап, Джефф Хольт. Oracle: Оптимизация производительности"? Да. >там вроде не поменялось нихуя Хз, конечно, книга 2006 года, уже экзадаты хуедаты появились у которых свои фишки в оптимизации. Но если основы особо не поменялась, то спасибо, почитаю её.
Аноны, выручайте С помощью анонов выше, я написал работающий вроде запрос. Препод сказал, что логика хуйня, но не суть. Мне нужно поставить правильное условие where. Суть условия в том, что, если в таблице История_перемещений в строке Дата_доставки_на_склад_назначения есть заказ, а в таблице Выдача вообще нет этого заказа, то нужно его вывести. То есть нужно вывести заказ, который приехал на склад (о нем есть запись в таблице История_перемещений) и у которого нет записи в таблице Выдача. Как это сделать? Я всё ещё тупой, если что-то неправильно пишу сердечно прошу простить
>>2257204 Ну смотри, вот получил ты джейсон с внешней системы, тебе его надо распарсить и разложить по столбцам, это будет правильный реляционный подход. Хранить же в отдельном столбце весь джсон имеет смысл, только если там какая-то дополнительная информация, например исходный не распаршеный джсон, или там комментарии и тех параметры, или например схема, т.е. данные которые возможно пригодятся пользователю, но поиск в которых ты не планируешь. Есть механизмы позволяющие работать джсонами внутри бд, но я более чем уверен работает этот медленно как говно, да если ты дотсанешь сначала 100 строк, потом заглянешь в джсон и как-то их отфильтруешь\выведешь только части джсона, да это валидный сценарий, а если ты достнёшь сто тысяч строк, и полезешь что-то искать в жсоне, то ты сам себе в жопу только выебешь.
Сколько получают аноны шарящие хорошо в SQL (включая db modeling, dwh, сложные бизнес логики, оптимизация запросов) и по минимуму процедурных расширений. Короче способные осилить почти любую поставленную задачу в банке/телекоме/it каком-нибудь связанную с sql, но именно с такими скиллами.
>>2258831 Не знаю как это называется. Но я почему-то считаю это миксом бизнес аналитика и SQL девелопера, потому что нужно нихуево так разбираться в бизнес логиках, в том как устроены все данные, в качестве данных, в том, чтобы скрипт работал охуительно быстро и чтобы к бизнес логике даже самый прошаренный управленец не смог бы придраться. Ну пусть будет дата инженер, похуй. Надоело горбатиться за копейки.
Приветик. Пишет вам макакен. Смотрите. Вот у меня есть таблица Clients. В ней есть всякая информация. Но есть поле(колонка) Port. Думаю можно догадаться, но я поясню. Port - это TCP-порт(1-65535) по которому с подключенным клиентом можно коммуницировать через мое приложение. Но не суть. А суть вот в чем. Я хочу, чтобы при добавлении в БД нового клиента этот порт присваивался. Порт должен быть уникальным, но с условиями: есть табличка ForbiddenPorts в которой, как нетрудно догадаться из названия - перечислены порты. Есть табличка: ServerSettings где есть всегда запись: StartPort - это минимальное значение порта который можно использовать и ServerPort - порт который использует сервер для подключения клиентов(может быть больше стартового, потому его тоже нельзя использовать). Как на текущий момент делаю я. Я на уровне своего приложения все разруливаю. Но меня это смущает. Во-первых, пришлось жуткий велосипед с очередями реализовывать. Во-вторых, мне кажется, что с этим БД должна справляться быстрее. Я знаю, что в большинстве СУБД - есть такая штука как триггеры. Вот я и хочу намутить триггер на вставку нового клиента. Вот только я чет не совсем понимаю как это делается.
>>2261553 если ты какую-то ебалу сетевую с длинным сроком жизни пишешь, то лучше сразу проектировать "порто-независимый" протокол, иначе клиенты все равно потом хлебнут горя с nat-ом и корпоративными админами.
>>2261718 Что конкретно-то? Выделять порты клиентам - это фича, которая в любом случае нужна. Выносить это на сторону базы, ну, да, я как-бы не хочу, но суть в том, что иначе - пришлось делать очень уродливый велосипед, с очередями и прочим и этот велосипед меня бесит своим наличием. Хочу чтоб в коде приложения просто было: if(isNewClient){db.Add("ClientsTable", clientFactory.CreateNewClient(registrationRequest));} А вместо этого там огромный уродливый монстр, который все равно лезет в базу, проверяет кто уже зарегался, ищет дырки, лезет смотреть кто заблокированные порты. Единственный плюс на стороне приложения, что я могу еще проверить что там система юзает в данный момент и если юзает - пропустить данный порт и пойти к следующему.
Ананасы, вопрос такой по структуре таблиц. Значит затеял небольшой проект для себя - анализ аукциона в вов. Уже сейчас понимаю предметы отслеживаемые надо как-то группировать их по нужным мне критериям: количество, цена, если предмет можно переделать в другой которой можно продать дороже, если у предмета падает цена в течении какого-то периода, его давно было на ауке и тп. Пока у меня только одна таблица с айдишником предмета и указанием по какому полю его фильтровать наличие\цена\количество и тд. Как вот такое можно сделать нормальным способом? Запилить таблицу "Группы" где одно из полей отвечает за условие и потом айдишник записи присваивать отслеживаемым предметам?
>>2262384 > Зачем ты выделяешь порты клиентам? Чтобы, сокет открыть. Что тут может быть непонятного? > Что есть клиентское приложение? Приложение, в котором реализована логика взаимодействия с сервером. Ну хули тут объяснять? Есть протокол. Есть PDU всякие. Есть логика приложения, построенная поверх этого протокола. Сидит-пердит, по таймеру просыпается, пытается зарегистрироваться, если да - погнали дальше делать штуки прикладного уровня, если нет - спим дальше.
> Ты знаешь значение таких терминов как : Знаю. Но эти технологии к тому что я делаю - не относятся.
>>2227895 (OP) Как эффективнее всего выучить уровни изоляции транзакций, когда я работаю с базой через Hibernate или Spring Data? Может быть есть какое-то мнемоническое правило?
Их как минимум 4 вида. На собеседовании всегда спрашивают какую и когда использовать и начинают ворошить кишочки всяких спринг дат и прочих хибернейтов, плавно переходя к работе PostgreSQL
>>2264492 Почему говно, идеальная система: дружелюбный интерфейс, высокая надёжность, лёгкость настройки отчетов. Рекомендую записаться на курсы от Нетологии!
>>2264492 Очевидно потому-что само 1с негибкое говно, работающая с БД через залупу, да и вобще это не аналитическая система. Ты же не задаёшься вопросом почему в валенках не бегают кросс?
>>2264492 ты хоть базу 1с открывал? там нет аналитики. Ни о каких кросс-запросах и речи нет. Работать быстро это в принципе не может. Там с большим трудом можно разобрать все файлы словаря чтобы добраться до самих значений. А таблицы они называют "регистры" (Не спрашивай откуда я это знаю.)
>>2264735 Однажды Эрнест Хемингуэй поспорил, что напишет самый короткий рассказ, способный растрогать любого. Он выиграл спор, написав всего 3 слова: «Аналаитика в 1С»
>>2264735 П.С. И называют они их регистрами, потому что прикладной разработчик оперируют объектными терминами, а не реальными таблицами СУБД. Не так часто на урокень СУБД приходиться опускаться. Обычно это задачи производительности, когда план запроса надо анализировать, который в реальности выполняется. Внезапно, также как и в любых других технологиях. Это по сути тот же ORM в нормальных ЯП, но не совсем.
>>2264735 П.С.П.С.П.С. А аналитикой там как таковой не занимаются. Это в первую очередь система для получения первичных данных, сводных отчетов и регламентированных. А производить какую-то АНАЛИТИКУ ДАННЫХ с поиском закономерностей, крутить кубы и вот это вот всё - это не задача баз на системе 1С в принципе. Есть дочерний продукт 1С:Аналитика (это не относится к платформе 1С - это стороння BI система от фирмы 1С) - вот там пытаются какое-то подобие сделать. А аналитиками в 1С других людей называют. Проблема терминов и не понимания, что для чего используется.
Сап двач, представь следующую ситуацию. Есть какие-то сущности, которые соотносятся как предок-потомок. Запрос может включать различные параметры фильтрации и пагинации для обоих. Вопрос, как достать результат, отфильтрованный по потомкам, но пагинированный по предкам, не запрашивая всех потомков?
>>2264898 >И называют они их регистрами, потому что прикладной разработчик оперируют объектными терминами, а не реальными таблицами СУБД. Не так часто на урокень СУБД приходиться опускаться. Обычно это задачи производительности,
Причем, если бы они это делали как средние разработчики изначально, сейчас бы любая дура с PowerBI наклепала бы отчетики - закачаешься.
>>2227895 (OP) Можно ли извлечь значение из таблицы, и сразу же сравнить его с имеющимся значением, чтобы получить true или false и выполнить, либо не выполнить следующий запрос? Если да, то как?
>>2268116 так уж повелось в айтишечке. Операционная система разграничивает процессы на основе идентификатора юзера.
Например ты мог бы сделать CREATE TABLE EXTERNAL FILE '/etc/passwd' и потом сделать select * from . И это реально работавший случай в базах данных великого прошлого
>>2268336 >Например ты мог бы сделать CREATE TABLE EXTERNAL FILE '/etc/passwd' и потом сделать select * from . Что произойдет? Какие-то пароли извлечет?
>>2268559 Ты как-то неправильно понимаешь информационную безопасность. Любая извлеченная информация повышает вероятность взлома. Например, ну там будет юзер anna с очевидным паролем anna123.
А вообще в былые времена дельфятники (эта конструкция из Firebird) легко могли под root запускать бд на линупсе. Люди простые и незнакомой среде не разбирались.
>>2268351 гранты обрабатывает БД оперируя своими объектами. Вот только эти объекты из реальной жизни, а не теоретические. Они позволяют и файлы читать и внешние программы запускать.
Есть несколько сотен тысяч географических точек (широта/долгота). И они хранятся в БД.
Я знаю, что в монге есть возможность делать геозапрос (чтобы прям точки сортировались по удалению от центра, вся хуйня).
Есть ли что-то такое же на мускуле/постгрессе? Если нет, то сильно ли сложно накрутить и будет ли это влиять на перформанс?
Не спрашиваю, "как" - я примерно представляю, как это может быть реализовано, просто у меня стоит выбор: либо реляционная БД, чтобы связывать мочу с говном, либо конкретно для геопоиска сделать чё-то вроде микросервиса с отдельной бд.
Есть запрос, выводящий запись, которая чаще всех встречается в столбце. Но как сделать так, чтобы запрос в случае, если несколько разных записей больше всех встречаются одинаковое кол-во раз, выводил бы их все?
Поясните за применение sqlite3 в вебе. Насколько она пригодна для использования в бекенде при написании небольших проектов или это вообще не ее область?
>>2227895 (OP) Как согласовывать обновы кода с изменениями базы данных?
Вот есть у меня джанго-приложуха, я в ней меняю схемы БД на удаленном тест-серваке через миграции, затем через какое-то время на этот сервер я заливаю другой код, из более ранее ветки, и там же сцуко схемы БД будут другие из-за чего могут вылезать занятные ошибки на NOT-NULL CONSTRAINT и прочее. Как с таким справляться?
>>2272283 Обычно держат несколько тестовых серверов, каждый со своей схемой, и если накатили миграции, приложение на более старое обычно уже не обновляют, если надо что-то потестить со старым приложением, юзают другой сервер, который ещё не обновляли. Или восстанавливают дамп тестовой схемы, но это влечёт за собой последующую еблю с восстановлением тестовых данных.
Парни и не парни(со штучкой), тут такое дело. Я наконец-то начал изучать веб-погроммирование, скачал купил книжку, дошло дело до темы баз данных. И на разделе с ознакомлением с SQLite я решил пройти метанит. Не потому, что считаю его крутым или потому что русек, а просто для чуть более детального ознакомления,в книге там совсем мало(оно и понятно). Не питаю иллюзий по поводу качества материала, просто, чтобы иметь представление на базовом уровне, что это вообще такое. Так вот, мне что-то это так понравилось, намного больше, чем дрочить код, что я решил у вас узнать, а есть ли вообще отдельная профессия для тех, кто любит дрочить бд? Я вроде слышал что-то такое, но к базам никогда не прикасался особо, поэтому не знаю. Какой вообще нужен стек знаний, нужно ли программировать на каком-то языке и если да, то на каком уровне, существуют ли джуны у вас, какой минимум знаний, есть ли сайты с рейтингом за решение задачек и т.д. Понятное дело, что скорее всего у меня потечёт жижа из анала, когда я столкнусь не с игрушечными примерами базового синтаксиса, но меня это не особо пугает.
>>2273652 > а есть ли вообще отдельная профессия для тех, кто любит дрочить бд? Есть администраторы баз данных (настройка, мониторинг, обслуживание и т.д.) и ещё разрабы на PL/SQL, T-SQL, PL/pgSQL. Админство лично мне представляется скучным и рутинным занятием, хотя кому как. PL/SQL и прочее - это в основном легаси из нулевых, когда бизнес-логику приложения писали целиком на хранимых процедурах, потихоньку уходит в прошлое, хотя вряд ли умрёт полностью. Ну и тестировщики с аналитиками, но для них это прикладной инструмент, а не основное занятие.
>>2227895 (OP) Можете объяснить разницу, чем EXISTS отличается от обычного подзапроса IN например вот такой запрос:
SELECT company_name, contact_name, customer_id FROM customers WHERE EXISTS (SELECT customer_id FROM orders WHERE customer_id = customers.customer_id AND freight BETWEEN 50 AND 100)
Подзапрос тут делает выборку или просто ищет один совпадающий условию? Но как потом работает внешний WHERE если WHERE EXISTS вернул true?
>>2227895 (OP) Правильно ли я понимаю, что в некотороых случаях (например десктопное приложение на ограниченное кол-во компьютеров) "сервером" в схеме может выступать СУБД? Скажем, просто задать в постгрес количество подключений в 1000 пользователей и пусть данные из их клинтских программ обмениваются с БД.
>>2279182 ну так если ты магазин уже освоил, то остальное по образу и подобию, ты же не бездумно скопировал, а понял, почему так? ну а более редкие случаи тут уже сам думай на основе полученных знаний, ну и просто по архитектуре общие сведения читай, книжек полно
А это нормально, что постгрес тратит по 30сек на поиск по текстовому полю в 20гб базе? Подозреваю, что должна быть какая-нибудь команда "ЗДЕЛОЙ ЗОЕБИСЬ", которая многократно ускорит поиск, но я о просто не знаю.
>>2227895 (OP) Пытаясь в проектирование баз данных, чет взбрела в голову следующая мысль... А что если взять, да и сгенерить все возможные модули различных моделей данных, и на принципах модульного программирования - автоматизировать конструирование совершенно любой модели данных? Можно так? Если да, то что мешает заебенить на этих принципах - внезапно, МОДЕЛЬ ВСЕЛЕННОЙ?
>>2282084 > А что если взять, да и сгенерить все возможные модули различных моделей данных, и на принципах модульного программирования - автоматизировать конструирование совершенно любой модели данных? > Можно так? Нельзя. В базе данных хранятся данные, но не логика, которая тоже часть модели данных. Можно сгенерировать код хранимых процедур, но такой генератор написать ещё сложнее, чем сами процедуры. > Если да, то что мешает заебенить на этих принципах - внезапно, МОДЕЛЬ ВСЕЛЕННОЙ? Почему в этом треде такое засилье философов? Это не ты здесь регулярно спрашиваешь про наноборду и написание своей СУБД?
>>2282095 >Нельзя. В базе данных хранятся данные, но не логика, которая тоже часть модели данных. Ну вот, глядя на пикчи со схемами данных, https://www.google.com/search?q=базы+данных+схемы+данны&tbm=isch я подмечаю, что они состоят, из одинаковых элементов, как-бы из модулей, расположенных в разном порядке. Собственно, идея в том, чтобы сгенерить всевозможные эти вот модули, добавить триггеры всякие, и сделать как-бы полный и универсальный набор модулей, соединяя которые, можно было бы быстро сконструировать и породить любую модель данных.
>Можно сгенерировать код хранимых процедур, но такой генератор написать ещё сложнее, чем сами процедуры. Ты имеешь в виду, под видом данных, хранить SQL-запросы, или чо? И написать генератор, генерирующий все возможные sql-запросы, так-сказать полный набор их, выбирая из которого отдельные - можно реализовать любую логику? Может даже так было бы проще, написать генератор, вместо того, чтобы ебаццо с написанием КАЖДОГО запроса. Но это не точно.
>> Если да, то что мешает заебенить на этих принципах - внезапно, МОДЕЛЬ ВСЕЛЕННОЙ? >Почему в этом треде такое засилье философов? Дык реальная, вроде, тема, не?
>Это не ты здесь регулярно спрашиваешь про наноборду и написание своей СУБД? Ой бляяяяеееееееть. Я пытался сделать базу, получилось вот что: https://github.com/username1565/nanoboard/tree/nanodb-sqlite/nanodb.exe-source/Database - файл nanodb.sqlite3.sql Дело за малым. Переписать целый файл PostDB.cs вписав туда опциональное использование sqlite3, через System.Data.SQLite.dll, компилируемую из открытого кода: https://github.com/username1565/System.Data.SQLite Но это слишком много ебалы, особого интереса пердолиться - нет, но наработки некие есть, но они разбросаны по куче папок так, шо яебал. Да и вообще интереса, как такового там нет, поэтому я предпочитаю сутками пипсовать криптоговно на наебиржах, вместо пердолинга с этой бородой. Хотите делайте сами. Может я и сам сделал бы, если бы у меня бабло не спиздили тупые дешёвые крысы. А так, приходится отвлекаться от подобного хобби, на всякую, более насущную поебнятину сраную.
>>2282084 >Если да, то что мешает заебенить на этих принципах - внезапно, МОДЕЛЬ ВСЕЛЕННОЙ? >>2282084 >А что если взять, да и сгенерить все возможные модули различных моделей данных, и на принципах модульного программирования - автоматизировать конструирование совершенно любой модели данных?
Количество объектов во Вселенной бесконечно. Количество типов объектов - менее бесконечно. количество ОТНОШЕНИЙ между объектами более бесконечно чем менее бесконечно количество типов.
Таким образом, это глупая идея. Не принесет тебе счастья, дорогая криптоманечька, воображающая себя программистом.
>Но это слишком много ебалы, особого интереса пердолиться - нет, но наработки некие есть, но они разбросаны по куче папок так, шо яебал
Чтобы приблизиться к гордому званию программиста, тебе нужно изучить что такое ORM. Обрати внимание, что это не чудо и проблем они только добавляют, но вот количество кода уменьшают, да.
>>2282409 Какие значения брать? Первые попавшиеся? Вот вернёт запрос Петю с зарплатой 500, но Васю он не покажет, хотя у него тоже 500, тебя это устраивает?
>>2282413 Да устроит. В этом и смысл. Что бы он отобрал все записи у которых зарплата уникальная. И вернул все столбцы целиком, а не только зарплату. Как на скрине я красным дорисовал.
>>2227895 (OP) Есть идея - сделать биржу для бартерного обмена. Суть в следующем. Есть сайт. На сайте регаются много юзеров. Эти юзеры попадают в таблицу Users, в базе данных. Каждый юзер имеет уникальные вещи, с их описаниями, попадающие в таблицу Properties. Для каждой вещи, каждый юзер, имеет свой уникальный акк. Для каждого акка, есть разные балансы, ну там доступный баланс, залоченный баланс, баланс ожидания. Баланс - символизирует долю права собственности владения вещью. Разные юзеры, по разным вещам, имеют разные доли права собственности, как-бы являясь акционерами вещи, а каждая вещь - это как-бы акционерное общество. Дальше, юзеры могут передавать права владения вещью - другим юзерам, или менять их на права собственности владения другими вещами, либо по договорным ценам (через объявления), либо размещая ордера, сортируемые по цене, и выводящиеся как на бирже, с перекрытием ордеров. Совокупность пар вещей, равна числу уникальных сочетаний по паре. Торговля всех вещей за все вещи, и любую вещь можно обменять на любую вещь, как целиком, так и наполовину, скажем.
Как только появляется заказ на покупку доли права собственности на владение вещью, владельцам достаточной доли - рассылаются уведомления. Чтобы не срать спамом, можно было бы рассылать уведомления раз в неделю, скажем, обрезая все предложения до 10 наивыгоднейших, скажем, с сортировкой по убыванию ценности предложений.
Собственно, как спроектировать ебучую БД, и все эти триггеры-хуиггеры?
>>2282987 Продолжу идею. Когда юзер открывает ордер на продажу части доли владения одной вещью, за какую-либо часть доли владения другой вещью (по указанной цене), выставляемая на продажу часть доли владения первой вещи, переводится с его доступного баланса, на его залоченный баланс, и висит, пока активен ордер. Ордер - можно отменить. Тогда, с залоченного баланса, доля владения первой вещью, возвращается на доступный баланс. Если юзер2 покупает долю влладения вещью1, за его долю владения вещью2, по указанной в ордере цене, и покупает, выставляя встречный ордер, то встречные ордера перекрываются, и происходит обмен долями владения вещью 1 и вещью2, между юзером1 и юзером2. При этом, с залоченного баланса одного юзера, доля владения переводятся на доступный баланс другого юзера, и наоборот. Всё это должно бы быть в виде одной обменной транзакции. Юзер также может зарегистрировать право владения вещью (декларируя вещь, или подтверждая владение документами всякими, или тупо заводя бабло), и вывести - оформив заявку на вывод. При этом, с доступного баланса, право владения переводится на баланс ожидания, и висит там до окончания обнала права владения, и его материализации - то есть до обработки поданной заявки на вывод.
>Невозможно выполнить команду DROP DATABASE пока существует хоть одно подключение к заданной базе. Однако можно подключиться к любой другой, в том числе и template1. template1 может быть единственной возможностью при удалении последней пользовательской базы данных кластера. Блять, как нахуй отключиться от бд? Там сука отсутствует такая кнопка, а подключается к бд автоматически при входе в pgAdmin4 При этом при подключении через терминал, pgsl требует ввести пароль для пользователя с именем пользователя компа!!! Что за бред нахуй? К нему не подходит мастер пароль, который я сделал при установке postgres, и не подходит пароль пользователя компьютера. Что за бред нахуй?
>>2283427 блять, подключился, на линуксе у нас значит будет параметр -u, а на винде -U блять, как удобно. И все равно ни работает ни DROP DATABASE имя; ни dropdb dbname Как блять отключится и удалить её?
Сейчас в процессе перехода в другой отдел, а там новый стек. БД на Greenplum. Концептуально понимаю, что это наследие Postgre с которым я работал, но у чем отличия? Пока что понял что есть новое понятие ключей дистрибуции которые связаны с MPP. Но в целом в чем разница? Призываю всех гринпламовцев в этом itt треде.
Сап. Есть MSSQL база доставшаяся в наследство. Планировщик по таймеру периодически запускает хранимую процедуру. Хранимая процедура выполняется 4 минуты, и при запуске грузит процессор на 100% на 30 сек, дальше спад до 40%. Соответственно в этот промежуток времени база данных "неохотно" выполняет другие запросы, и для некоторых время отклика возрастает выше 30 сек (что вызывает эксепшен у вызвавшего эту процедуру веб-приложения). Посему вопрос: 1. можно ли как-то "замедлить" выполнение хранимой процедуры? 2. можно ли как-то выставить высокий приоритет некоторым запросам, чтобы БД выполняла их сразу при вызове?
>>2284222 Повезло, чел. Не знаю что там с ними делают, но у нас на собесах были двое после гловбайта (одного даже взяли на свою голову), и оба были отбитые.
Какое-то вечное суечение, все время требуют внимания к себе, какие-то блять инфантильные хотелки вечно: дай мне ментора ой а где у вас печеньки. Все время пытаются как-то тупо наебать: челик сливался на простейших вопросах про отличия hash от merge join под соусом ну это неинтересно просто))).
Как будто взяли аутистов-омежкиных и имплантировали им социоблядское шило в жопу, худшее из двух миров.
>>2284265 > отличия hash от merge join О, я как раз нихуя не понял нахуя мерж нужен, хеш понятно, 2 большие таблицы соединять, а мерж я сколько не пытался приткнуть везде только хуже делает.
>>2284269 Если тебе нужен весь целиком результат джойна больших таблиц, особенно когда готовых индексов нет, то там мерж лучше за счет последовательного io.
>>2284303 Мердж проводит сравнение по столбам по которым есть индекс, т.е. таблица должна быть упорядочена, и он по порядку сравнивает значения. При таком подходе, можно сравнивать только пары которые ещё не попадались. Хеш джоин вычисляет хеш функцию, которая делит на группы таблицу и проводит сравнения в рамках эти
>>2284310 Спасибо, анон, буду знать, а то документация от моего гладкого мозга отскакивала как горох от бетона. >>2284311 Ну 2 исторических таблицы с 2002 года я хуй соединю в любом случае. А вот если предварительно фильтрануть по дате то там где нестед залупа задыхается хеш справляется.
>>2284318 >Ну 2 исторических таблицы с 2002 года я хуй соединю в любом случае.
Ну да, я про кейсы когда нужно именно все поджойнить. Мерж тем и хорош что работает на любых размерах и любом количестве памяти за O(log n) сканирований.
Алсо, оказалось в википедии https://en.wikipedia.org/wiki/Hash_join приводятся решения для кейса когда хэш не влезает в память. Простое работает за O(n) сканирований что очевидно хуже на больших таблицах.
И там же есть Grace hash join, на первый взгляд там вообще ровно два скана, то есть О(1), кажется что вин и я пока не могу найти где подвох кроме ехидных перекосов. Интересно.
Анончи, пытаюсь установить Postgress на свою Шиндовс 10 (перепробовал дохуя версий от 10 до 14, в том числе 32-битный установщик пробовал скачивать), но какого-то хуя у меня в Пуске она не появляется, а попытки открыть shell зайдя в папку заканчиваются только моментальным закрытием консоли. С чем эта хуйня может быть связана? Заебался уже
>>2286732 Сэнк ю анонче, оно работает. Но всё равно интересно, какого хуя на других компах всё прекрасно и без консоли устанавливается и запускается, а вот именно мне приходится ебаться
анончики, подскажите можно ли заполнить табличку case'ом? и как собстна это сделать в оракле? спасибо доброанон что подсказал решение, я знал ты лучший!
>>2287193 Если правильно понял, тебе нужен INSERT INTO YOURTABLE (<COLUMNS>) SELECT ...; А в селекте любой запрос с case и CTE, генерирующий строки таблицы.
гайс, не подскажете как из первого запроса получить второй? из мыслей только заюнионить эту же табличку с запросами с null значениями по дню месяцу и году, и так же заебенить оконку с соответсвующим partition by по месяцу, году, продукту.
Merge хорош когда, данные уже в отсортированном виде поступают после предыдущего шага. Как раз после скана по идексу btree можно такую ситуацию получить. Но!
1.Нужно учитывать, что сама сортировка также требует памяти, и если выборка не помещается в память, то начинается запись на диск промежуточных результатов с последующей подкачкой. 2. Для merge два входных потока данных должны быть отсортированы.
При прочих равных hash должен выигрывать в большинстве случаев, если одна из таблиц помещается в память. Grace Hash Join - алгоритм в котром зная - что ни одна таблица в память не поместится - мы разбиваем их на куски по ключу хэша на часть которая помещается в память - и остальные - которые улетают на диск. Происходит это для обеих таблиц, далее куски с одинаковыми хэшами загружаются и сравниваются. Этот алгоритм оптимизировали до Hybryd Grace Hash Join, который при первом проходе по внешней таблице - сразу джойнит строки найденные в сформированном батче hash таблицы - те что не нашел - скидывает на диск. Один проход таким образом экономится. Точнее часть, которая сджойнилась.
Молю поясните тупому, как в постгресс работают рекурсивные запросы и глвное как и зачем в них использовать Join, который не Left/Right/Inner, просто Joinна сайте доки про этот Join две непонятнын строчки.
Здароф, анон. Есть MSSQL база, в хранимой процедуре которой выполняется простой селект на таблицы, находящиеся на связанном сервере, который тоже MSSQL. Таблицы на связанном сервере периодически пополняются новыми данными. Хранимая процедура выполняется с некоторой интовой переменной для поиска, и зачастую первые вызовы ничего не возвращают, так как данных еще нет, а после добавления данных на связанном сервере хранимая процедура возвращает результат. Но иногда случается какой-то затык, и процедура продолжает ничего не возвращать в то время как данные у таблицах связанного сервера уже есть. Такое чувство что процедура закешировала результат выдачи запроса, и не хочет сбрасывать кеш так как не видит изменения таблицы(потому что те лежат на связанном сервере а не в своей бд). Подскажи, MS SQL вообще умеет в кеширование результатов выдачи запросов? Можно ли отключить кеширование для одного запроса / хранимой процедуры? Может можно как-то не явно отключить кеширование, например сносить план выполнения или еще чего?
Как с помощью бд следить за часовым лимитом? Т.е. с 13:00 можно заинсертить 100 сущностей успешно, а 101ый и последующие инсертить с ошибкой. С 14:00 счетчик сбрасывается и снова можно успешно инсертить. К бд обращаются несколько инстансов. Seq? Таблица, которая инкрементирует счетчик? Что еще можно придумать?
Если память позволяет и сортировать не надо, проще всегда хешем ебашить. Кейс, когда всё на всё надо, и при этом обе таблицы здоровые - ебать редко бывает.
>>2290375 А если создать таблицу (id bigserial, time datetime, uid uuid) и дерево индекс по time. А потом select count from xxx where date = текущий час, если результат подходит, то инсертить еще одну сущность, иначе ошибка. Это дорого получится?
>>2282297 >Чтобы приблизиться к гордому званию программиста Да пошёл ты нахуй, со своей гордостью - нельзя гордиться блядь. И уж тем более, нахуй иди со своими званиями - ебал я козлосучую пирамиду, где заради звёздочек на пагону готовы убивать всякие гондоны козлосучие.
Тащемта, я уже давненько занимаюсь быдлоговнокодингом года, эдак с две-тыщи-хуйнадцатого. >тебе нужно изучить что такое ORM. Да, я вижу схемы данных, в sqlite expert professional, но когда ебическое число таблица там, то хуй отследишь связи, они не помещаются уже, блядь, в экран. Тем не менее, я вижу одинаковые паттерны, как-бы, и одинаковые куски из взаимосвязанных таблиц, в сложной схеме, поэтому и взбрела в башку, как-бы, вышеизложенная мысль. Проектирование баз данных, из таких модулей, чем-то напоминает мне соединение сложных схем из логических элементов. Чем-то похоже, но я пока не могу понять, именно, чем.
>>2292552 В селекте можно вычислять выражения, а в выражении может быть что угодно, хоть вызов процедур и функций, умного названия у этого нет. Реализация самих функций/процедур общего названия тоже не имеет, потому что не стандартизована и делается в разных СУБД по-разному, будь то "процедурные расширения SQL", UDF или что-то ещё.
Поясните за транзакционную модель и прочие вопросы на интервью для бэкендеров. Пиздец, работаю уже почти 10 лет, на пыхе клепаю говно всякое, а тут вдруг меня спросили, почему КОНКРЕТНО сбалансированное дерево, лежащее в основе индексов БД быстрее несбалансированного. Ну я и в лужу сел, конечно. Был посрамлён. Собираюсь изучать БАЗУ теперь.
>>2296620 Чтобы O(log(N)) соблюдать. Например, если у тебя строится индекс по ID, который считается простым инкрементом, обычное дерево будет расти всё время вправо и будет по сути связным списком, поиск в котором за O(N). А так у тебя дерево каждый раз балансируется, и поиск будет намного быстрее.
>>2296682 Через операцию сравнения. > GUID К примеру, лексикографически. > индекс из двух колонок Сначала сравнение по первой, а если равны, то по второй.
>>2299890 Тут фрондендеры которые лезут на бек Создай стравполь strawpoll.com. Выяснишь что 90% программистов не знают теорию БД. Простенькие селекты максимум.
>>2299890 Ты лучше спроси про уровни изоляции транзакций. Вангую, что 90% оподливятся в рейтузы, т.к. не понимают какой уровень изоляции выбрать, чтобы не положить прод при создании аккаунта, например.
>>2300008 А что не таз? Представь пользовалель яросно дрочил кнопку sign-up. Создались две конкурирующие транзакции c одинаковым мейлом. В конце транзакции выполяют insert into users. При read commited транзакция закончившаяся первой вставит email в БД, другая при инсерте вставленое увидит и обламается, потому что на поле email установлено unique. Блокировки непричем.
Есть таблица с товарами каждому товару может соответствовать несколько локаций, мне надо не размножить товар по локациям, а все локации соответствующие одному товару поместить в строчку с товаром(можно либо в разные столбцы, либо в один, непринципиально), как это сделать?
>>2299890 >Это такой уровень понимания баз данных у программистов? Не проблема программистов, что в БД ходить в 2022-м можно только через строчные литералы или говно-ОРМ.
>>2301222 На плюсах много проектов, где вообще не используются реляционные СУБД. Изучать SQL нужно с чётким пониманием, что он тебе пригодится, иначе, если ты попасть на проект, где SQL не нужен, время будет потрачено впустую.
>>2301284 >sql >время, потраченное впустую Звучит как "выбери одно", честно говоря. Но тут зависит от того, насколько глубоко спускаться в кроличью нору, если на уровне select * from movies, то это никогда не бывает бесполезно, если ты в принципе работаешь программистом, а если на уровне уровней изоляции и проброса предикатов, тогда да.
>>2301222 чел ты совсем без мохгов в 22м20 вкатыватся через плюсы? Иди учи реакт и рисуй формочки. Тебе надо рынок труда для начала изучить, а не погромирование, валенок.
>>2227895 (OP) Есть где почитать про практики по переводу спредшитов в базы данных? Хочу какие-то направления посмотреть, обсуждения, не я же первый об этом подумал.
Бля, аноны, я получил оффер на Джуниор администратора бд, хотя у меня за спиной только книжка Грабера и 40 задач на скл ех. Насколько реальные рабочие задачи отличаются от теории и головоломок? Чего ожидать? К чему гото6?
скажи кабанчику, что к использованию БигДаты и ИИ нужно 10 лет планомерно готовиться, как это произошло в X5, где в эксель прайс-лист просто не влезал, а не заебывать тебя экселем.
>>2303040 Ты в программировании вообще ни гу-гу? Это же элементарная задача. Если это просто один файл, то читаем его построчно и помещаем данные в соответствующие колонки в БД, сохраняем. Или у тебя куча файлов с перекрестными ссылками друг на друга? Тогда заебёшься просто парсить/записывать, нужно что-то типа CRM писать, либо готовую брать.
>>2303688 >Или у тебя куча файлов с перекрестными ссылками друг на друга? Тогда заебёшься просто парсить/записывать, нужно что-то типа CRM писать, либо готовую брать. О чём и разговор. Где про это почитать? Но с пандасом мне ответ понравился. Чувствуется настоящий двачерский настрой.
>>2303844 Если у тебя там реально вагон файлов, то тебе тот пчел правильно сказал: твой дон кабаньо – хитрожопый пидор, а ты – наивный долбоёб. Что такое CRM можешь узнать у поисковика.
>>2305742 В смысле как? Берёшь и переписываешь логику скулайтовых таблиц на условный постгрес. Если тебе ещё и данные перенести, то тут надо отдельный модуль на твоём любимом языке для миграции с одной бд в другую написать заодно. А если хочешь сделать форк с блэкджеком и шлюхами заместо бд, то и версирование этих миграций.
>>2306035 >А нафиг постгресс? Что ты там собрался оптимизировывать на скулайте? Он в конечном счёте синхронный, так что "оптимизировать" его можно только на уровне приложения.
>>2306099 Я имею в виду саму бд, ну там таблички-хуички, я же как видишь в проектировании БД дуб дубом, блядь. Наплодил хуйни из кучи таблиц и запутался в ней, лол.
>>2227895 (OP) Слушайте, я вот в методе бегу в базу за целой таблицей, а возвращаю из метода уже только 2 трети полей допустим. А можно брать из базы не целую таблицу, а сразу только нужные поля. Так вот, какой вариант лучше и почему?
>>2310362 >Или проще вытащить половину полей, чем все поля? В общем случае не сложнее. Хотя конечно никто не видел конкретно твой кейс, может у тебя данные отбираются не просто так, а с хитровыебанными неиндексированными условиями.
Как можно адекватно заполнить бдшку с пикрл на 10 000 строк? К тому же не совсем понимаю как можно сгенерировать имена и фамилии... только если брать их из отдельного списка. Но если опустить этот момент и просто сделать заполнение рандомными символами
>>2313073 Я придумал как можно без оконок изъебнуться.
with p_numbered as (select p1.PeriodID,count(p2.period_id) num,avg(Value) Value from from period_table p1 join period_table p2 on p2.period_id<=p1.period_id group by p1.Period_id) select pn2.Period_id from p_numbered pn1 join p_numbered p2 on pn2.num=pn1.num-1 where not pn2.Value=pn1.Value
>>2312883 >>2313087 А вот так эту х-ню нельзя написать? select value_1 (select Period_id, value as value_1, lag(value) over(order by Period_id) as value_2 from table) as a where value_1<> value
>>2313283 Точнее вот так with table1 as ( select 1 Period_id, 10 value union all select 3, 10 union all select 5, 20 union all select 6, 20 union all select 7, 10 union all select 9, 40 union all select 10, 40 ) select Period_id from ( select Period_id, value as value_1, coalesce(lag(value) over (order by Period_id), 123456) as value_2 from table1 ) as a where value_1 <> value_2
>>2313087 >>2313290 >>2313290 Мускул не умеет в with, ну точнее до 8.0 не умел. Короче, я хуй знает как решить эту ебанину на скл, ничего лучше, чем сделать это в две строчке на питоне я не придумал. Может и к лучшему, что я провалил этот собес, задача абсолютно не склевская.
>>2313599 Активе рекорд - это когда в один класс свалили дата маппер, саму сущность и связанную с ней бизнес-логику в лучших традициях ООП, где собака сама умеет лаять.
Господа, помогите! Есть задача вывести из базы имя пользователя и его последний комментарий. Работающее решение получилось https://sqltest.net/#1649233 но мне не нравится что блок кода повторяется. Как это можно сократить? Если пытаюсь в SELECT MAX(id) FROM ... вставить вместо кода алиас comm он пишет что "Table 'sqltest_tmp_db.comm' doesn't exist"
пацаны, в универе закончился семестр DB, было весело и интересно. Мне зашло. Какие есть варианты дальше в этом направлении катиться? Реально ли найти потом работу по этому направлению или базы данных - это лишь вишенка к какому-нибудь торту из разработки и сисадминства?
Прошу помощи с запросом, вот к примеру запрос который выводит записи мне нужно дописать, чтобы те записи у которых один flight_id и flight_date соединялись, к примеру скринах видно flight_id = 39 и flight_date = '2017-06-01 12:05:00' таких записи 3, должна получиться 1 где будет qty(quantity) = 7, соедениться коды уникальные через запятую, то есть iata_code = CHM01,CHM11R1 и result_price = 6 119,23
Вывести имена сотрудников и количество их подчиненных, у которых в подчинении более 10 человек.
И решение:
select e1.name, count(1) from employee e1 join employee e2 on e1.ID=e2.chief_id group by e1.id, e1.name having count(e1.id) > 3
Объясните, пожалуйста, что за e1? Почему тут просиходит объединение одной и той же таблицы from employee e1 join employee e2? Или что это вообще значит?
Как MySQL хранит дату? Под нее отведено 4 байта. В последних двух хранится правильно день и месяц, а в первых двух не то, например, 2002-08-31 хранится как 210, 15, 8, 31. 2003-12-22 хранится как 211, 15, 12, 22. Что за кодировка для года? Мне нужно распарсить дату из сырых байтов в проге, не хочу писать "UNIX_TIMESTAMP(имя поля)".
еос - есть один скрипт. Суть такова - в двух таблицах встречаются 3 юнита, он считает сколько раз они там встречаются и выводит те, которые встречаются больше заданного числа раз. И вот я решил добавить четвертый и мне надо корректировать скрипт. Как переписать его чтобы не хардкодить названия юнитов?
select * from ( select sum(count), 'one' as unit from ( select count(unit), 'one' as unit from test1 where unit = 'ONE' union all select count(unit), 'one' as unit from test2 where unit = 'ONE' ) as i union select sum(count), 'two' as unit from ( select count(unit), 'two' as unit from test1 where unit = 'TWO' union all select count(unit), 'two' as unit from test2 where unit = 'TWO' ) as j union select sum(count), 'three' as unit from ( select count(unit), 'three' as unit from test1 where unit = 'THREE' union all select count(unit), 'three' as unit from test2 where unit = 'THREE' ) as k ) as u where u.sum > 6
еос - есть один скрипт. Суть такова - в двух таблицах встречаются 3 юнита, он считает сколько раз они там встречаются и выводит те, которые встречаются больше заданного числа раз. И вот я решил добавить четвертый и мне надо корректировать скрипт. Как переписать его чтобы не хардкодить названия юнитов?
select * from ( select sum(count), 'one' as unit from ( select count(unit), 'one' as unit from test1 where unit = 'ONE' union all select count(unit), 'one' as unit from test2 where unit = 'ONE' ) as i union select sum(count), 'two' as unit from ( select count(unit), 'two' as unit from test1 where unit = 'TWO' union all select count(unit), 'two' as unit from test2 where unit = 'TWO' ) as j union select sum(count), 'three' as unit from ( select count(unit), 'three' as unit from test1 where unit = 'THREE' union all select count(unit), 'three' as unit from test2 where unit = 'THREE' ) as k ) as u where u.sum > 6
>>2320811 Так вахтёр то анону так и не ответил, а я начал, но не успел прилетал фаршмарк от абу. Тхред и так почти сдох, и ещё вахтёры, ну раз вам ок, аривидерчи.
Есть тут умельцы в оракловскую хуйню? В общем дело такое, есть процедура которая добавляет запись, у нее поле с созданным айдишником IN/OUT, значит она по идее должна я его возвращать. Если принтить его через DBMS, то всё ок. Вопрос в другом, мне нужно чтобы после выполнения процедуры вернулась запись с этим айдишником. SELECT между Begin и End использовать не дает, returning к процедурам не применим, я хуй знает что блять делать
>>2321506 Зачем мне лечиться? Я пишу на плюсах, поэтому у меня был выбор либо писать селект для каждой таблицы и захардкодить названия полей, либо написать селект для всех таблиц и предусмотреть функцию, которая распарсит дату потом. >>2321586 Я уже решил проблему виновата библиотека плюсовая, а не mysql, в самой бд дата это три инта, но спасибо
Ребят, такой вопрос. Есть бд на монго, крутится локально. Написал приложение не ноде, хочу все упаковать в контейнер, вопрос - как из контейнерной бд подрубиться к локальной? Я понял что надо делать том, но как в этот том запихнуть существующие данные?
>>2324021 Ты случайно не из тех, кто учит питон для того, чтобы написать на нём бота для телеги?
Параметры в execute передаются не так. Вместо параметров ты должен писать %s, а вторым аргументом передать массив со значениями, и они поставляются в запрос сами. > cur.execute("INSERT INTO test (num, data) VALUES (%s, %s)", [100, "abcdef"])
>>2324026 >Ты случайно не из тех, кто учит питон для того, чтобы написать на нём бота для телеги? да > cur.execute("INSERT INTO test (num, data) VALUES (%s, %s)", [100, "abcdef"]) спасибо!
>>2324215 это сродни разговора со стеной, да и я слишком ссу подобным заниматься. Бот уже рабочий для нужд университета, просто надо было базу прикрутить
как удалить все ячейки в базе, подходящие под условие, а не только одну? У меня две одинаковых ячейки и удалилась только одна >cur.execute("DELETE from users where chat_id=(%s) AND (button=(%s) OR floor=(%s) OR room=(%s) OR typeofproblem=(%s))", [message.chat.id, 'text', 1, 'text', 'text'])
Cап двач, вкатываюсь в oracle sql и пришел к вам с просьбой о помощи в решении задачки. Понимаю что нужно использовать конструкцию execute immediate и возможно задать loop через неявный курсор, но пока опыта мало в PL/SQL и осилить задачу не могу, буду благодарен если поможете разобраться.
Необходимо Во всех таблицах и вьюшках текущей схемы найти первые по алфавиту столбцы среди столбцов, имеющих типы данных не BLOB и не CLOB. Найти минимальное значение, хранящееся в таком первом по алфавиту столбце каждой таблицы или вьюшки, привести его к строковому типу данных (в формате по умолчанию). С помощью анонимного блока вывести в dbms_output отчёт о таблицах о вьюшках, их первых по алфавиту столбцах и минимальных значениях в этих столбцах. Не использовать вспомогательных таблиц (не делать create table). Минимальные значения столбцов следует определять непосредственно запросом к каждой таблице.
>>2325955 > вкатываюсь в oracle sql Ахахахах, ты че, ебанутый, они же тютю из РФ, все на попенсорсы переходят и отказываются от оракла. Посвятил этой хуйне лучшие годы жизни, кстати, так что слушай. >Во всех таблицах и вьюшках текущей схемы Достаточно представления user_tab_columns, там сразу и с вьюх и с таблиц столбцы. >первые по алфавиту столбцы среди столбцов, имеющих типы данных не BLOB и не CLOB. min(case when data_type not in ('CLOB', 'BLOB') then column_name end) group by table_name Собственно, по полученной инфе ты слепишь селект вида «таблица — первый по алфавиту столбец». Далее начинается pl sql часть
declare v_str varchar2(32767); begin for z in (тут селект из прошлого пункта) loop execute immediate 'select to_char(min('||z.column_name||')) from '||z.table_name into v_str; dbms_output.put_line(v_str); end loop; end;
Был рад помочь, но на уточняющие вопросы не отвечу. Все писано по памяти и не проверено в жизни, может быть придется немного погуглить. Пока.
Блять, создал бд на хероку, экспортровал туда по этой >>2326302 инструкции локальную базу (пикрил 2), с локальной базой код спокойно работал, а сейчас когда я вставил туда новый хост, пароль и имя бд (пикрил 2) на хероку бот не работает. Также если попытаться к бд на хероку подключиться с pgAdmin4, то там высвечиваются какие-то тысячи баз (пикрил 3) и все при попытке открытия выдают какую-то ошибку подключения (пикрил 4). Как можно наиболее быстро решить проблему?
Есть таблицы Channel, User, Video, UserVideo. UserVideo содержит записи о том, что конкретный юзер уже посмотрел конкретное видео. Пик1 запрос выводит все видео на канале 666, "отмечая" среди них те, которые юзер 5 уже посомтрел.
Но как написать запрос, если нет айди юзера, а есть его юзернейм? Пытаюсь что-то типа пик2, но выводит только те видео, которые посмотрел юзер, не выводя все видео канала целиком.
SELECT FROM "Channel" c LEFT JOIN "Video" v ON v.channel_id = c.channel_id LEFT JOIN "UserVideo" uv ON uv.video_id = v.video_id AND uv.user_id = 5 WHERE c.channel_id = 666
SELECT * FROM "Channel" c LEFT JOIN "User" u ON u.user_id = 5 LEFT JOIN "Video" v ON v.channel_id = c.channel_id LEFT JOIN "UserVideo" uv ON uv.video_id = v.video_id AND u.username = 'alex' WHERE c.channel_id = 666
>>2326410 короче с ноута к базе хероку подключиться получается, а если запускать бота на самом хероку то бот не работает почему-то, без базы работает и на ноуте и на хероку
Всем привет! Очень нужна помощь, нужно сделать скрипт который генерит много строк и есть одно поле в котором помимо букв есть важный айдишник (например 'Сделка NO-1488') и нужно чтобы он инкрементировался каждую итерацию на +1 от максимального числа в таблице. Вопрос как это можно реализовать? insert into table_name (work_id) values (select max(work_id)+1 from table_name) Не работает из-за того что строка(
Помогите пожалуйста, поставил pgadmin4 на свою виртуалку, ( виртуалка на Hyper-v , debian). мне он пишет - веб морда доступна по http://127.0.0.1/pgadmin4, но она недоступна! Из моего компа, на котором виртуалка крутится. Как можно сделать так чтобы была доступна? И как можно адрес поменять веб морды? И как сделать чтобы эта веб морда была доступна из интернета?
>>2327249 ну и залупа. Слишком много вариантов сломаться, чтобы угадать какой у тебя. у меня, конечно, все работает в этой конфигурации, но я то Tier V Senior Devops. А у тебя не заработает.
может ты лучше docker desktop поставишь? там хотя бы все вопрос с маппингом портов не стоит, тк 127.0.0.1 по сути общий.
Кстати, чтобы подключиться ИЗ докера к сервису на компе, надо не "localhost:5432 указывать, а "host.docker.internal:5432"
>>2227895 (OP) Аноны, помогите, ебусь с этими базами целый день, как удалить все партиционирование с таблицы ? Так же, нужно еще б в INFORMATION_SCHEMA.PARTITIONS актуализировать данные, так как они почему-то не показывают правильно значение в TABLE_ROWS
Сап, аноны. Есть 5 mysql бэкапов, но при загрузке каждого руется на разную строку с ошибкой ERROR 1824 (HY000) at line 2: Failed to open the referenced table ИМЯ ТАБЛИЦЫ Что ему нужно? Я не разбираюсь в БД
Объясните, почему когда я ставил postgreSQL на винде, то всё удалось сделать с помощью мастера установки и затем pgAdmin. Сейчас попробовал то же сделать в линукс и у меня жопа сгорела: pgAdmin калечная, в которой вырезано половина функционала, а в качестве замены надо в консоли вводить всё. У создателей postgreSQL какое-то негативное отношение к линуксам?
А потом просто нужно... Выберите любую ячейку в диапазоне данных. Выберите Фильтр> данных. Выберите Текстовые фильтры или Числовое фильтры, а затем выберите сравнение, например Между. Введите условия фильтрации и нажмите кнопку ОК. Выбери жизнь. Выбери работу. Выбери карьеру. Выбери семью. Выбери телевизор с большим экраном. Выбери стиральную машину,
В запросе кучу-кучу раз использую конструкцию типа
where колонка in ('aa', 'bb', 'cc')
При этом содержание скобок везде одинаковое. Из-за этого запрос выглядит громоздко и его неудобно править.
Как мне в начале запроса один раз привести этот список, а далее просто на него ссылаться?
Сейчас попробовал в начале запроса создавать временную таблицу, записывать в неё необходимые данные, а далее использовать конструкцию with (см. ниже), но время выполнения запроса увеличилось примерно в пять раз, что неприемлемо.
CREATE TEMPORARY TABLE code_table_temp(code_temp VARCHAR(80)); INSERT INTO code_table_temp VALUES ('aa'), ('bb'), ('cc) ... ... ... with code as (select code_temp as code from code_table_temp) select sum(case when колонка not in (select code from code) then...
>>2334039 Можешь в двух словах пояснить, что это и чем отличается от описанного выше способа, пожалуйста? >>2334147 >Интерполяцией строк должно заниматься приложение, а не БД. Да какое там приложение, я просто запросы для статистики делаю. Если бы я это внутри какого-нибудь скрипта делал (что не умею), то там бы было понятно, как подстановку переменных сделать вместо тупого копирования.
>>2334285 >Можешь в двух словах пояснить, что это и чем отличается от описанного выше способа, пожалуйста? Что вызывает вопрос, union? Просто загугли чел, это база, источников миллиард. Идея была в том чтобы не создавать таблицу, я даже не ебу даст ли это какой-то эффект.
У меня вопрос к метрам Синьёры-помидоры на месте? При использование SELECT ... INTO, строки вставляются в строгом порядке, или согласно именам, т.е. если мы хотим поменять порядок вставки, нужно менять алиас или порядок колонок в селекте?
Query result: +----+---------+-----+ | Id | Name | Old | +----+---------+-----+ | 1 | Tom | 12 | | 2 | Lucy | 99 | | 3 | Frank | 20 | | 4 | Jane | 99 | | 5 | Robert | 1 | | 6 | Session | 20 | +----+---------+-----+ Affected rows: 6
Query result: +---------+-----+--------------------------+ | Name | Old | GROUP_CONCAT(s.position) | +---------+-----+--------------------------+ | Jane | 99 | Killer | | Lucy | 99 | Slave | | Frank | 20 | Master,Dude | | Session | 20 | Slave | | Robert | 1 | Dude,Master | +---------+-----+--------------------------+ Affected rows: 5
Есть две таблички, я их джойню, необходимо выбрать имя, возраст и роль всех одногодок.
SELECT n.Name, n.Old, GROUP_CONCAT(s.position) FROM NAMES n LEFT JOIN STATS s ON n.Id = s.name_id
GROUP BY n.Name, n.Old HAVING n.Old IN (
SELECT names.Old FROM NAMES names LEFT JOIN STATS stats ON names.Id = stats.name_id GROUP BY names.Old HAVING COUNT(names.Old) > 1 ) ORDER BY n.Old DESC;
Но у меня выходит нечто громоздкое + если один и тот же человек встречается дважды - он становится одногодкой с самим собой. Есть ли способ решить задачу, используя всего один селект? Предполагаю, копать надо в сторону селфджойна уже сделанного джойна?
CREATE TABLE NAMES( Id integer PRIMARY KEY, Name text, Old integer );
CREATE TABLE STATS( Id integer PRIMARY KEY, name_id integer, position text );
/ Create few records in this table / INSERT INTO NAMES VALUES(1,'Tom', 12); INSERT INTO NAMES VALUES(2,'Lucy', 99); INSERT INTO NAMES VALUES(3,'Frank', 20); INSERT INTO NAMES VALUES(4,'Jane', 99); INSERT INTO NAMES VALUES(5,'Robert', 1); INSERT INTO NAMES VALUES(6,'Session', 20);
INSERT INTO STATS VALUES(1, 1, "Master"); INSERT INTO STATS VALUES(2, 2, "Slave"); INSERT INTO STATS VALUES(3, 3, "Dude"); INSERT INTO STATS VALUES(8, 3, "Master"); INSERT INTO STATS VALUES(4, 4, "Killer"); INSERT INTO STATS VALUES(5, 5, "Master"); INSERT INTO STATS VALUES(6, 5, "Dude"); INSERT INTO STATS VALUES(7, 6, "Slave");
SELECT FROM STATS; SELECT FROM NAMES;
SELECT n.Name, n.Old, GROUP_CONCAT(s.position) FROM NAMES n LEFT JOIN STATS s ON n.Id = s.name_id
GROUP BY n.Name, n.Old HAVING n.Old IN (
SELECT names.Old FROM NAMES names LEFT JOIN STATS stats ON names.Id = stats.name_id GROUP BY names.Old HAVING COUNT(names.Old) > 1 ) ORDER BY n.Old DESC;
>>2336708 >>2336710 Читай про нормализацию и денормализацию. Если всё держать в одной таблице, некоторые селекты могут ускориться, но всё остальное замедлится.