|
|
|
| Есть таблица temp
поля name и numer
данные например:
aaa 25
sss 12
www 50
ddd 10
aaa 14
sss 80
uuu 70
Нужно выявить дубликаты по полю name и выяснить их номера по полю num
при запросе например:
SELECT *
FROM temp
GROUP BY name
HAVING COUNT(name) > 1
выдает имена дубликатов но как выяснить их номера (среди номеров дубликатов нет) ?
я попробовал вот такую конструкцию
SELECT *
FROM temp
GROUP BY name, numer
HAVING COUNT(nom) > 1 AND COUNT(numer)= 1
не понимаю почему не выдает ни одного результата
а запрос
SELECT *
FROM temp
GROUP BY name, numer
HAVING COUNT(nom) > 1 OR COUNT(numer)= 1
работает но выдает совершенно ненужные недубликатные записи
Уже голову поломал. решение крутиться рядом но никак не приходит
выручайте люди добрые! | |
|
|
|
|
|
|
|
для: Iskatel
(13.06.2007 в 13:45)
| | Вам нужны все записи кроме уникальных или просто вывести уникальные записи? | |
|
|
|
|
|
|
|
для: cheops
(13.06.2007 в 18:34)
| | мне нужно вывести все записи которые повторяются более одного раза по первому полю
например из
nom | num
-----------------
aaa | 25
sss | 12
ddd | 10
aaa | 14
sss | 80
uuu | 70
aaa | 19
kkk | 66
----------------
мне нужно вывести
aaa 14
aaa 19
aaa 25
sss 12
sss 80
по идее должен работать но не работает запрос:
SELECT *
FROM temp
GROUP BY nom, num
HAVING COUNT(nom) > 1 AND COUNT(num)= 1 | |
|
|
|
|
|
|
|
для: Iskatel
(14.06.2007 в 13:23)
| | как-то так
SELECT nom, num FROM tab JOIN
(SELECT COUNT(nom) AS cnt, nom FROM tab GROUP BY nom HAVING cnt > 1
) AS tcnt USING(nom)
|
| |
|
|
|
|
|
|
|
для: Trianon
(14.06.2007 в 13:38)
| | спасибо! попробую сейчас | |
|
|
|
|
|
|
|
для: Iskatel
(14.06.2007 в 13:40)
| | Попробовал. Все работает. Большое спасибо!
главное разобраться как это делается.
если запрос
SELECT nom, num FROM tab JOIN
(SELECT COUNT(nom) AS cnt, nom FROM tab GROUP BY nom HAVING cnt > 1
) AS tcnt USING(nom)
получается что JOIN сравнивает исходную таблицу с виртуальной таблицей созданной вложенным запросом (которая находит только дубликаты) ей присваивается имя tcnt и результат выводиться по условию схожести полей nom - USING(nom)
как все просто :) и как сложно когда практики мало :(
оказыватеся какая полезная штука JOIN
зы: JOIN и RIGHT JOIN это ведь одно и то же?
--------------------
еще похожий вариант и устранение ошибки по двойнику поля num в обоих SELECT для правильного отображения -tab.nom
SELECT tab.nom, tab.num FROM tab JOIN
(SELECT nom FROM tab GROUP BY nom HAVING COUNT(nom)> 1
) AS tcnt USING(nom) | |
|
|
|
|
|
|
|
для: Iskatel
(14.06.2007 в 16:16)
| | зы: JOIN и RIGHT JOIN это ведь одно и то же?
нет.
с некоторой изрядной натяжкой можно сказать, что
a LEFT JOIN b
и
b RIGHT JOIN a
это одно и тоже.
Пока не появится третья таблица.... или сервер, не поддерживающий RIGHT.
LEFT JOIN
RIGHT JOIN
OUTER JOIN
это всё внешние соединения,
JOIN и INNER JOIN - внутренние. | |
|
|
|
|
|
|
|
для: Trianon
(14.06.2007 в 16:37)
| | то есть если две разные таблицы то LEFT JOIN
а если одна таблица и вложенный SELECT из нее то просто JOIN ?
внутреннее соединение и внешнее в чем разница?
Например смотрел в справочнике MySQL - Синтаксис оператора JOIN
синтаксис обьясняет а логику и подробности нет
трудно усваиваемо ,,, | |
|
|
|
|
|
|
|
для: Iskatel
(14.06.2007 в 17:06)
| | >то есть если две разные таблицы то LEFT JOIN
>а если одна таблица и вложенный SELECT из нее то просто JOIN ?
нет конечно. Это совершенно независимые вещи.
>внутреннее соединение и внешнее в чем разница?
a join b on условие_соответствия
получит только те записи таблицы a, которым нашлось соответствие в b
a left join b on условие_соответствия
получит только все записи таблицы a, независимо от того, нашлось ли им соответствие в b
соответствующие поля из b будут установлены в NULL
>Например смотрел в справочнике MySQL - Синтаксис оператора JOIN
>синтаксис обьясняет а логику и подробности нет
>трудно усваиваемо ...
читайте учебники. | |
|
|
|