2012-04-10 6 views
3

я не могу получить это право SQL-запрос ...SELECT DISTINCT TOP 5 в SQL Server

Я хочу, чтобы первые 5 последних комментариев от tblComment. Проблема в том, что я получаю больше одного комментария с тем же ProductID. Я не хочу этого.

SELECT DISTINCT TOP 5 
    tblProduct.ProductID, 
    tblProduct.ProductName, 
    tblComment.DateAdded 
FROM 
    tblComment 
INNER JOIN 
    tblProduct ON tblProduct.ProductID = tblComment.ProductID 
ORDER BY 
    tblComment.DateAdded DESC 

Что я делаю неправильно?

+1

Итак, существует пять разных продуктов, и вы хотите получить последние комментарии для каждого продукта? –

+0

Это соединение «один-ко-многим». Вы получите много строк :) Вот посмотрите на этот вопрос: http://stackoverflow.com/questions/6922675/how-to-select-unique-rows-from-one-to-many-relationed-tables-in-mysql – PhD

+0

Есть сотни продуктов, и я хочу, чтобы 5 лучших продуктов, которые в последнее время добавили к нему комментарии. Даже если один продукт имел последние пять комментариев, я не хочу, чтобы этот продукт пять раз в результате. Я хочу пять разных продуктов. – user1007103

ответ

6

Предположим, что ваш комментарий таблица имеет поле идентификатор, попробуйте следующее:

SELECT TOP 5 

tblProduct.ProductID, 
tblProduct.ProductName, 
tblComment.DateAdded 

FROM tblComment 
JOIN tblProduct ON tblProduct.ProductID = tblComment.ProductID 
JOIN (Select ProductID, max(id) as maxid From tblComment Group By ProductId) t on tblComment.id = t.maxid 

ORDER BY tblComment.DateAdded DESC 
+1

+1 чистый ответ с max на соединении. – Taryn

+0

Отлично работает! Большое спасибо! – user1007103

0

Вам нужно будет выбрать sub - используйте следующий пример в соответствии с вашими потребностями.

SELECT TOP 5 tblProduct.ProductID, 
      tblProduct.ProductName, 
      tblComment.DateAdded 
FROM tblComment INNER JOIN 
    tblProduct ON tblProduct.ProductID = tblComment.ProductID 
    and tblProduct.ProductID 
     IN (
      SELECT tblProduct.ProductID 
      FROM tblComment 
        INNER JOIN tblProduct ON tblProduct.ProductID = tblComment.ProductID 
      GROUP BY tblProduct.ProductID 
      HAVING count(tblProduct.ProductID ) =1 
     ) 
0

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

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

with lastComment as (
    select c.productID, max(DateAdded) DateAdded, 
    row_number() over(order by max(dateAdded)) rank 
    from tblComment c 
    group by c.productID 

) 

SELECT 
    tblProduct.ProductID, 
    tblProduct.ProductName, 
    tblComment.DateAdded 
FROM 
    tblProduct 
    join lastComment ON tblProduct.ProductID = lastCommnet.ProductID 
WHERE 
    lastComment.rank >= 5 
ORDER BY lastComment.rank