powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Можно ли запросом или только перебором?
6 сообщений из 6, страница 1 из 1
Можно ли запросом или только перебором?
    #40064001
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблицы "фамилии" "имена" "отчества".
Из них рандомно выбирается ФИО. Но оно не должно повторяться, так что есть четвертая таблица вида id_фамилии,id_имени,id_отчества , в которой собственно перечислены ранее выбранные комбинации.

Вопрос в том, можно ли запросом получить список фамилий, для которых еще есть хотя бы одно неиспользованное сочетание ФИО? (а затем по фамилии такой же список имен, а по фамилии-имени отчеств) или только перебором?

ЗЫ. Содержимое таблиц может меняться, так что квази-рандомные переборщики с запоминанием последнего индекса не подойдут. Без базы, думаю, не обойтись.
...
Рейтинг: 0 / 0
Можно ли запросом или только перебором?
    #40064038
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что вы курите?

Хотя.... Помниться еще в древнейшей игрушке на ZX Spectrum, под названием Elite делались случайные имена звезд. И все были уникальными.

Делается это на самом деле элементарно. Берутся например три байта. Каждый из них, естественно, может быть от 0 до 255. Значит делаем 256 имен, 256 фамилий, 256 отчеств.
Берем случайное число в трехбайтном диапазоне - вот вам и совершенно уникальная тройка. Чтобы не повторялось - да, надо будет вести список какие числа уже выпадали, так что либо булевый массив с O(1) эффективностью, но память сожрет, либо действительно таблица с простейшим индексом (и будет у вас O(logN) зато с памятью проблем не будет).
Если хочется, можно брать не восьми-битные индексы для составных частей а какие-нибудь другие. Или, с учетом что имен личных не так много как фамилий, можно под имена отдать например 5 бит, а под фамилии все 16 (ну насколько фантазии у вас хватит).

Модератор: Тема перенесена из форума "SQLite".
...
Рейтинг: 0 / 0
Можно ли запросом или только перебором?
    #40064045
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsql
Вопрос в том, можно ли запросом получить список фамилий, для которых еще есть хотя бы одно неиспользованное сочетание ФИО?

Да.
...
Рейтинг: 0 / 0
Можно ли запросом или только перебором?
    #40064061
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsql
можно ли запросом получить список фамилий, для которых еще есть хотя бы одно неиспользованное сочетание ФИО?
Да запросто.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
WITH 
cte1 AS ( SELECT COUNT(*) cnt1
          FROM Имена ),
cte2 AS ( SELECT COUNT(*) cnt2
          FROM Отчества )
SELECT Фамилия
FROM Фамилии 
LEFT JOIN ЧетвёртаяТаблица USING (id_фамилии)
GROUP BY Фамилия
HAVING COUNT(*) < ( SELECT cnt1 * cnt2
                    FROM cte1, cte2 )


Предполагается, что ни в одной таблице нет дубликатов, а также что в каждой из таблиц Имена и Отчества есть минимум по 2 записи.
...
Рейтинг: 0 / 0
Можно ли запросом или только перебором?
    #40064078
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsql
Есть таблицы "фамилии" "имена" "отчества".
Из них рандомно выбирается ФИО. Но оно не должно повторяться, так что есть четвертая таблица вида id_фамилии,id_имени,id_отчества , в которой собственно перечислены ранее выбранные комбинации.

Вопрос в том, можно ли запросом получить список фамилий, для которых еще есть хотя бы одно неиспользованное сочетание ФИО? (а затем по фамилии такой же список имен, а по фамилии-имени отчеств) или только перебором?

ЗЫ. Содержимое таблиц может меняться, так что квази-рандомные переборщики с запоминанием последнего индекса не подойдут. Без базы, думаю, не обойтись.

Если таблицы без повторов, то все возможные комбинации это декартово произведение, т.е. произведение количества записей в каждой таблице.
Считаешь произведение количеств имен и отчеств (XXX) и выбираешь фамилии по которым меньше
Код: sql
1.
select id_фамилии, count(*) as cnt from фамилии group by id_фамилии having count(*) < XXX


если будешь делать выборку недостающих по каждой фамилии, то есть смысл сохранить все варианты в отдельную таблицу, если разово, то вставь подзапросом
Код: plaintext
1.
select id_имени, id_отчества from имена, отчества into IO


и выбирать так
Код: sql
1.
2.
select IO.* from IO left join FIO on IO.id_имени = FIO.id_имени and IO.id_отчества = FIO.id_отчества
       where FIO.id_фамилии = ... and FIO.id_имени is NULL
...
Рейтинг: 0 / 0
Можно ли запросом или только перебором?
    #40064325
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina, Dima T

Да дурак я, дурак. Ведь понимал что общее количество вариантов равно первое помножить на второе

и на третье, но сравнить по количествам не догадался.

Спасибо вам!
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Можно ли запросом или только перебором?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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