Непростой запрос

VictorKr

Новичок
Вернуть значения, которые имеют максимальный охват другого поля

Добрый день,

таблица:

DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
`name` varchar(100) NOT NULL,
`keyword` varchar(100) NOT NULL,
UNIQUE KEY `unic` USING BTREE (`name`,`keyword`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `test` (`name`,`keyword`) VALUES
('груша', 'фрукт'),
('яблоко', 'фрукт'),
('капуста', 'овощ'),
('картофель','овощ'),
('груша', 'зеленый'),
('капуста', 'зеленый'),
('яблоко', 'зеленый');

Запрос должен вернуть:

keyword
-------
зеленый
овощ

логика следующая:
так как в "зеленый" входят все "фрукт", "фрукт" возвращать не надо.
т.е. вернуть нужно ключевые слова, которые имеют максимальный охват поля "name"

MySql v.5.0.41
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
VictorKr
Сам пробовал?
В чем проблема?
В count, join и WHERE?

-~{}~ 05.03.08 11:28:

Может стОит "разнести" данные и добавить поле "количества цветов" в БД?
 

antson

Новичок
Партнер клуба
VictorKr,а сформулировать полностью чего надо не пробывал ?
и потом постараться дойти до формулировок которые можно
переложить на релятивную математику.

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


б) множество целиком входит в другое если число его элементов
равно числу вхождений в конкретное другое

в) кейворд нам не подходит, если существует хотя бы одно б)

резюме результирующий запрос будет с кучей подзапросов
(см. ограничения конкретной версии скл)
или его разбивать на части
 

Sluggard

Новичок
VictorKr
А что надо вернуть при:
яблоко - зеленый, красный, синий
груша - зеленый, красный, синий
слива - зеленый, красный, синий
обрикос - зеленый, желтый
персик - красный, желтый
вишня - синий, желтый?
 

VictorKr

Новичок
Sluggard
Получается такая таблица:

яблоко зеленый
слива зеленый
груша зеленый
обрикос зеленый

персик красный
слива красный
груша красный
яблоко красный

яблоко синий
груша синий
слива синий
вишня синий

обрикос желтый
персик желтый
вишня желтый

нет группы, которая включала бы все объекты другой группы,
соответственно ответ будет:

keyword
-------
зеленый
красный
синий
желтый

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

antson
Вот у меня как раз и проблема,
как на sql написать "множество name не является полной частью любых других множеств других ключевых слов"
как сравнивать множество с множеством.

Как сравнить содержимое столбца name всех цветов со всем содержимым остальных цветов
 

antson

Новичок
Партнер клуба
количество элементов множества
select count(name) from test where keyword='красный'


-- количество вхождений элементов множества красный в множество зеленый
select sum(
select 1 from test a where a.name=b.name and a.keyword='зеленый'
) from (
-- все элементы множества красный
select dicrinct name from test where keyword='красный'
)b


ну а теперь это еще парочку раз завернуть в подзапросы
или построить курсор для следующих запросов.

тебе нужна например таблица c полями
keyword1,keyword2,counIn1,FoundIn2

т.е кейворды таблицы test фулл джоиним сами с собой без учета записей
где кейворды совпадают

select c.keyword as key1,d.keyword as key2
from (select distinct keyword from test) c,(select distinct keyword from test) d where c.keyword<>d.keyword

counIn1,FoundIn2 я описал выше. подставь в запрос заменив константы .

-~{}~ 06.03.08 08:59:

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

на ms-sql 100% такое можно накрутить. В муське смотри ограничения синтаксиса.

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

-~{}~ 06.03.08 12:34:

VictorKr, кстати не отчаевайся если запрос не будет получаться сразу вот по ссылке ниже
люди упорно пишут запрос по месяцу
http://sql-ex.ru/quest_rating.php
среднее время решения самой сложной задачи
46952 минут / 60 / 24 = 32,6 дня
(это время от момента как человек увидел условие задачи, до того как его решение вернуло тотже результат, что и проверочный запрос)

а те кто смог дойти до 138 задачи никак начинающими уже не назовешь ;)
 
Сверху