2012-02-08 21 views
2

Я хочу проецировать индексы для всех продуктов, имеющих такое же название, как я использую следующее в качестве подзапроса.sql GROUP HAVING selection

продукта (PID, название)

SELECT p.title 
FROM product p 
group by title 
HAVING (COUNT(p.title) > 1) 

это выводит дублирующие названия хорошо, но как я проектирую в PID «s вместо этого?

ответ

5
SELECT p.pid, p.title 
FROM product p 
    INNER JOIN 
    (SELECT p.title 
     FROM product p 
     GROUP BY title 
     HAVING (COUNT(p.title) > 1)) t ON t.title = p.title 

вот пример его работы с sqlfiddle:

http://sqlfiddle.com/#!3/25e77/1

+0

извините, это возвращает 38000 записей, есть только 51 дублирующих записей в БД. – AlasdairC

+0

@AlasdairC Сколько заголовков возвращает ваш запрос SU? также, вы что-то изменили в моем запросе? –

+0

думал, что нет, но на втором взгляде он полностью возвращает правильное количество результатов, pid каждого заголовка, который появляется не один раз, и это именно то, что мне нужно, спасибо. – AlasdairC

1

Я думаю автообъединение это самый простой ответ на этот случай. Обратите внимание на то, как мы тестируем для различных PIDs, но те же названия:

SELECT p1.pid FROM products p1 JOIN products p2 
       ON p1.pid <> p2.pid AND p1.title = p2.title; 

(я тестировал здесь: http://sqlfiddle.com/#!2/c8b8d/18)

+0

, если я положил 'distinct' перед p1.pid, он возвращает тот же номер, что и @ Bassam-mehanni – AlasdairC