powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выбрать слова с нужным набором букв
9 сообщений из 9, страница 1 из 1
Выбрать слова с нужным набором букв
    #38363892
Haybulla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые, разработчики!..
Не первый день ломаю голову над формированием запроса.


Условия.

Есть база данных слов. Выглядит так
words { word_id , word} // id, слово
words_weight {code, quantity, word_id} // код буквы, кол-во это буквы в слове, ид слова



Пример.

words
word_id | word
1 | аббатство

words_weight
code | quantity | word_id
224 | 2 | 1 // буквы 'а' в слове с id = 1 (аббатство) 2 штуки.
225 | 2 | 1 // буквы 'б' в слове с id = 1 (аббатство) 2 штуки.
226 | 1 | 1 // буквы 'в' в слове с id = 1 (аббатство) 1 штука.
238 | 1 | 1 // буквы 'о' в слове с id = 1 (аббатство) 1 штука.
241 | 1 | 1 // буквы 'с' в слове с id = 1 (аббатство) 1 штука.
242 | 2 | 1 // буквы 'т' в слове с id = 1 (аббатство) 2 штуки.


Задача.

Написать запрос, формирующий выборку их тех букв, которые мы задали.
Если расширить - не включать в запрос те буквы, которые мы исключили.

К примеру - взять все слова, где не встречается мягкий знак, твердый знак, где две буквы 'а' и одна буква 'о'.

Будьте добры.
...
Рейтинг: 0 / 0
Выбрать слова с нужным набором букв
    #38363898
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это учебная задача?
Если буква в слове не встречается, то в таблице будет запись с нулем или вообще не будет записи?

Как вариант (если не будет записи):
Код: sql
1.
2.
3.
4.
5.
SELECT t1.word_id
FROM words_weight t1
WHERE (t1.code, t1.quantity) IN ((224,2),(238,1))
GROUP BY t1.word_id
HAVING NOT EXISTS (SELECT NULL FROM words_weight t2 WHERE t2.word_id=t1.word_id AND t2.code IN (код_твердого_знака, код_мягкого_знака)
...
Рейтинг: 0 / 0
Выбрать слова с нужным набором букв
    #38363924
Haybulla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не то. Я условие не совсем полно определил, видимо.

Выборка идет из тех слов, где в одном конкретном слове присутствуют сразу две буквы 'а', одна буква 'о', отсутствуют 'ь' и 'ъ'.
Пример - слово 'кашалот' (две 'а', одна 'о' и отсутствие мягкого и твердого знаков).
Расширенная версия запроса предполагала бы выборку из слов, где букв от 1 до n. То есть - выбрать все слова, где буква 'а' встречается от 1 до 3 раз, буква 'о' единожды, и отсутствуют буквы мягкого и твердого знака. Все буквы в примерах взяты наобум. Могут быть любые буквы.

А под Вашу выборку подпали слова, где либо две 'а', либо одна 'о', либо отсутствует мягкий знак, либо твердый знак.


Да, слова, не подпадающие под условия выборки, не выводятся вовсе.

P.S. Задача учебная наполовину. С одной стороны я подтягиваю Mysql, с другой стороны это не домашнее задание))..
...
Рейтинг: 0 / 0
Выбрать слова с нужным набором букв
    #38363956
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HaybullaВыборка идет из тех слов, где в одном конкретном слове присутствуют сразу две буквы 'а', одна буква 'о', отсутствуют 'ь' и 'ъ'.
Пример - слово 'кашалот' (две 'а', одна 'о' и отсутствие мягкого и твердого знаков).
Расширенная версия запроса предполагала бы выборку из слов, где букв от 1 до n. То есть - выбрать все слова, где буква 'а' встречается от 1 до 3 раз, буква 'о' единожды, и отсутствуют буквы мягкого и твердого знака. Все буквы в примерах взяты наобум. Могут быть любые буквы.
на реляционное деление похоже ...

words
word_idletterquantity1а21б11в11о11с11т12а22к12ш12л12о12ъ12т1

search
lettermin_quantitymax_quantityа13о11ъ00ь00
Код: sql
1.
2.
3.
4.
5.
select w.word_id
from search s left join words w
on s.letter=w.letter and ((w.quantity between s.min_quantity and s.max_quantity) or (s.min_quantity=0 and s.max_quantity=0))
group by w.word_id
having count(w.word_id) = (select count(*) from search where min_quantity<>0 and max_quantity<>0)


Код: sql
1.
2.
3.
word_id
-----------
1
...
Рейтинг: 0 / 0
Выбрать слова с нужным набором букв
    #38363961
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
джойн можно и inner

fix
qwerty112
Код: sql
1.
2.
3.
4.
5.
select w.word_id
from search s inner join words w
on s.letter=w.letter and ((w.quantity between s.min_quantity and s.max_quantity) or (s.min_quantity=0 and s.max_quantity=0))
group by w.word_id
having count(w.word_id) = (select count(*) from search where min_quantity<>0 and max_quantity<>0)
...
Рейтинг: 0 / 0
Выбрать слова с нужным набором букв
    #38363963
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HaybullaА под Вашу выборку подпали слова, где либо две 'а', либо одна 'о', либо отсутствует мягкий знак, либо твердый знак.Сорри, отвлекся, мысль ускакала, часть забыл.
Код: sql
1.
2.
3.
4.
5.
SELECT t1.word_id
FROM words_weight t1
WHERE (t1.code, t1.quantity) IN ((224,2),(238,1))
GROUP BY t1.word_id
HAVING COUNT(*)=2 AND NOT EXISTS (SELECT NULL FROM words_weight t2 WHERE t2.word_id=t1.word_id AND t2.code IN (код_твердого_знака, код_мягкого_знака)
...
Рейтинг: 0 / 0
Выбрать слова с нужным набором букв
    #38363973
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно, вы правы, все это очень похоже на реляционное деление… Если не вспомнить простую вещь (идея не моя, просто реализация, увы)
Код: sql
1.
2.
3.
4.
5.
select * from words where
length(word)=length(replace(word,'ъ','') and
length(word)=length(replace(word,'ь','') and
length(word)=length(replace(word,'а','')+2 and
length(word)=length(replace(word,'о','')+1
...
Рейтинг: 0 / 0
Выбрать слова с нужным набором букв
    #38363978
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
таки, без exists - никак (
Код: sql
1.
2.
3.
4.
5.
6.
7.
select w.word_id
from search s inner join words w
	on s.letter=w.letter and (w.quantity between s.min_quantity and s.max_quantity)
where not exists 
	(select 1 from search s1 inner join words w1 on s1.letter=w1.letter where w.word_id=w1.word_id and s1.min_quantity=0 and s1.max_quantity=0)
group by w.word_id
having count(*) = (select count(*) from @search where min_quantity<>0 and max_quantity<>0)
...
Рейтинг: 0 / 0
Выбрать слова с нужным набором букв
    #38363983
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или, с учетом табличного задания требований,
Код: sql
1.
2.
3.
4.
5.
6.
select * from words w where 
(select count(*) 
  from search s 
  where length(w.word)-length(replace(w.word,s.letter,'')
     between s.min_qty and s.max_qty
)=(select count(*) from search)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выбрать слова с нужным набором букв
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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