#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
#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
#8 14.03.07 22:21
Re: [mysql] подскажите реализацию деления
Ок, насчет порядка в запросе соглашусь, видно, что писал "от руки".
А насчет опыта: ты проверь свою "схему решения", какой смысл показывать человеку очевидный джоин, если он деление не реализует. Напиши тогда решение. Сомневаюсь, что этот вариант оптимальный :)
Исправлено Prdd (14.03.07 22:25)
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
#13 14.03.07 22:40
#14 14.03.07 22:45
#15 14.03.07 22:57
#16 14.03.07 23:02
#17 14.03.07 23:07
#18 15.03.07 00:28
#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
#22 15.03.07 14:03
#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
#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

