Официальный сайт студ.городка НГТУ
Программирование и БД » [mysql] подскажите реализацию деления 

#1  14.03.07 17:44

[mysql] подскажите реализацию деления

есть две таблички

Первая
===================
имя     фамилия

вася     петров
петя     сидоров
вася    сидоров
вова     петров


Вторая
====================
петров
сидоров


Результат должен быть такой
=======================
вася


Помогите сделать чтобы один запрос всего был. Именно один. Очень надо. Заранее спасибо!

Offline

#2  14.03.07 18:58

Re: [mysql] подскажите реализацию деления

Вот один из вариантов

Код::

CREATE TABLE #T1 (FName varchar(10), SName varchar(10))
CREATE TABLE #T2 (SName varchar(10))

INSERT INTO #T1 VALUES ('вася', 'петров')
INSERT INTO #T1 VALUES ('петя', 'сидоров')
INSERT INTO #T1 VALUES ('вася', 'сидоров')
INSERT INTO #T1 VALUES ('вова', 'петров')


INSERT INTO #T2 VALUES ('петров')
INSERT INTO #T2 VALUES ('сидоров')

SELECT DISTINCT T.FName
FROM #T1 T WHERE NOT EXISTS
	(SELECT * FROM #T2 WHERE NOT EXISTS
	(SELECT * FROM #T1 T1 WHERE
		T1.FName = T.FName AND
               	T1.SName = #T2.SName))

Исправлено Prdd (14.03.07 18:59)

Offline

#3  14.03.07 19:18

Re: [mysql] подскажите реализацию деления

а без подзапросов можно как нить?
может join специфический какой нить?

Исправлено xaver (14.03.07 19:18)

Offline

#4  14.03.07 19:43

Re: [mysql] подскажите реализацию деления

Джоинов всего 3, ну т.е. 4 :)
Без подзапросов не обойдешься, это точно. Могу еще попробовать вариант какой-нибудь, но все они будут с подзапросами

Offline

#5  14.03.07 21:02

Re: [mysql] подскажите реализацию деления

SELECT name, COUNT(name) as CNT FROM table1 INNER JOIN table2 ON table1.familia=table2.familia HAVING cnt>1 GROUP BY name

Offline

#6  14.03.07 21:35

Re: [mysql] подскажите реализацию деления

npo. написал(а):

SELECT name, COUNT(name) as CNT FROM table1 INNER JOIN table2 ON table1.familia=table2.familia HAVING cnt>1 GROUP BY name

мало того что запрос нерабочий, т.к. клауза group должна идти до having'a (но точно утверждать не буду, т.к. это действительно для SQL-92, в mysql может быть свой синтаксис), так он еще и деление не реализует

Offline

#7  14.03.07 22:00

Re: [mysql] подскажите реализацию деления

=) улыбаешь малый, просто обозначил схему решения. поверь мне, опыт в SQL у меня немалый.

Offline

#8  14.03.07 22:21

Re: [mysql] подскажите реализацию деления

Ок, насчет порядка в запросе соглашусь, видно, что писал "от руки".
А насчет опыта: ты проверь свою "схему решения", какой смысл показывать человеку очевидный джоин, если он деление не реализует. Напиши тогда решение. Сомневаюсь, что этот вариант оптимальный :)

Исправлено Prdd (14.03.07 22:25)

Offline

#9  14.03.07 22:31

Re: [mysql] подскажите реализацию деления

Код: sql:

SELECT 
t1.name, 
COUNT(t1.name) AS CNT
FROM 
table1 AS t1 
INNER JOIN 
table2 AS t2 
ON 
(t2.surname=t1.surname)
GROUP BY 
t1.name
HAVING 
COUNT(t1.name)>1;


только что выдал вася, 2... странно, почему?

Offline

#10  14.03.07 22:33

Re: [mysql] подскажите реализацию деления

Я тебе могу еще как миниум 3 запроса написать, результатом которых будет вася, 2.
А ты добавь во вторую таблицу 'иванов', тогда в результате деления должно вернуться пустое множество, а у тебя вернется по-прежнему вася, 2

npo. написал(а):

странно, почему?

Offline

#11  14.03.07 22:36

Re: [mysql] подскажите реализацию деления

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

Offline

#12  14.03.07 22:36

Re: [mysql] подскажите реализацию деления

с тобой спорить не собираюсь. задача решена.

Offline

#13  14.03.07 22:40

Re: [mysql] подскажите реализацию деления

npo. написал(а):

с тобой спорить не собираюсь

к чему тогда менторский тон

npo. написал(а):

=) улыбаешь малый

Offline

#14  14.03.07 22:45

Re: [mysql] подскажите реализацию деления

хочешь это обсудить - прошу в приват.

Offline

#15  14.03.07 22:57

Re: [mysql] подскажите реализацию деления

спасиб ребят. завтра утром протестирую.

Offline

#16  14.03.07 23:02

Re: [mysql] подскажите реализацию деления

спасибо это слишком много, лучше два пирожка. лучше с картошкой или сосиской.

Offline

#17  14.03.07 23:07

Re: [mysql] подскажите реализацию деления

Обсуждать нечего, тем более в приват. Ты высказался в общем форуме, в приват мне это почему-то не написал.
На этом предлагаю закончить обсуждение запроса :)

Исправлено Prdd (14.03.07 23:07)

Offline

#18  15.03.07 00:28

Re: [mysql] подскажите реализацию деления

=))

Исправлено npo. (15.03.07 00:33)

Offline

#19  15.03.07 13:02

Re: [mysql] подскажите реализацию деления

Код: sql:

SELECT 
t1.name, 
COUNT(t1.name) AS CNT
FROM 
table1 AS t1 
INNER JOIN 
table2 AS t2 
ON 
(t2.surname=t1.surname)
GROUP BY 
t1.name
HAVING 
COUNT(t1.name)>1;


этот пример хорош только для первоначального варианта
а вот если в таблицу с фамилиями добавить Козлов к примеру то по принципу деления должен возвращаться ноль так как у таблички с именами нет Козлова во второй колонке.

Вот ... сижу думаю ... как еще сделать и что добавить чтоб такого не было

Offline

#20  15.03.07 13:44

Re: [mysql] подскажите реализацию деления

Код::

 
SELECT 
t1.name, 
COUNT(DISTINCT t1.surname) AS CNT,
COUNT(DISTINCT t2.*) AS CNT2
FROM 
table1 AS t1 
INNER JOIN 
table2 AS t2 
ON 
(t2.surname=t1.surname)
GROUP BY 
t1.name
HAVING 
COUNT(DISTINCT t1.surname)=COUNT(DISTINCT t2.*);

примерно так, пример не проверял

Offline

#21  15.03.07 14:02

Re: [mysql] подскажите реализацию деления

Вот пример как он выдает на новой таблице

famil          CNT    CNT2
Еремеев    3    3
Иванов    1    1
Петров    1    1
Сидоров    2    2
Усачев    1    1

То есть при равенстве количества имен в одной табл и количества имен во второй таблице он и выводит равными порциями ...

Offline

#22  15.03.07 14:03

Re: [mysql] подскажите реализацию деления

надо короче как то посчитать отдельно число строк во второй табличке ...

Offline

#23  15.03.07 14:05

Re: [mysql] подскажите реализацию деления

блин ... вроде так

Код: sql:

SQL-запрос: 
SELECT t1.famil, COUNT( DISTINCT t1.teach ) AS CNT, COUNT( DISTINCT t3.predm ) AS CNT2
FROM teach AS t1, predm AS t3
INNER JOIN predm AS t2 ON (
t2.predm = t1.teach
)
GROUP BY t1.famil
HAVING COUNT( DISTINCT t1.teach ) = COUNT( DISTINCT t3.predm )


пардон за левые имена таблиц и полей просто я на своем примере отрабатывал

короче я тупо третий алиас завел чтобы считать количество строк во второй табличке

Исправлено xaver (15.03.07 14:06)

Offline

#24  15.03.07 14:31

Re: [mysql] подскажите реализацию деления

Всё отлично. Теперь все работает с любыми изменениями таблиц. Спасибо всем за участие ;)
Пиво как нить организуем ) кеке

Offline

#25  15.03.07 16:17

Re: [mysql] подскажите реализацию деления

xaver написал(а):

SELECT t1.famil, COUNT( DISTINCT t1.teach ) AS CNT, COUNT( DISTINCT t3.predm ) AS CNT2
FROM teach AS t1, predm AS t3
INNER JOIN predm AS t2 ON (
t2.predm = t1.teach
)
GROUP BY t1.famil
HAVING COUNT( DISTINCT t1.teach ) = COUNT( DISTINCT t3.predm )

не совсем уверен, что это операция деления.

Offline

#26  15.03.07 16:23

Re: [mysql] подскажите реализацию деления

во всяком случае она реализует именно то что мне нужно ;)

Offline

Программирование и БД » [mysql] подскажите реализацию деления 

ФутЕр:)

© Hostel Web Group, 2002-2026.   Сообщить об ошибке

Сгенерировано за 0.092 сек.
Выполнено 14 запросов.