MySQL DISTINCT не отфильтровывается - PullRequest
0 голосов
/ 08 ноября 2011

У меня есть следующий SQL-запрос:

SELECT DISTINCT(tbl_products.product_id), tbl_products.product_title,
            tbl_brands.brand_name, tbl_reviews.review_date_added, 
            NOW() AS time_now
            FROM tbl_products, tbl_reviews, tbl_brands
            WHERE tbl_products.product_id = tbl_reviews.product_id AND
            tbl_products.brand_id = tbl_brands.brand_id
            ORDER BY tbl_reviews.review_date_added DESC

, который должен отфильтровать любой дубликат product_id. К сожалению, выбор tbl_reviews.review_date_added делает каждую запись уникальной, что означает, что DISTINCT больше не будет работать.

Есть ли другой способ выполнить этот запрос, чтобы product_id все еще был уникальным?

Я сделал GROUP BY, и проблема в том, что я отображаю tbl_reviews.review_date_added на веб-сайте, и он выбираетсамая старая датаМне нужна самая новая дата.

С уважением

Ответы [ 4 ]

2 голосов
/ 08 ноября 2011

С приведенным описанием трудно быть уверенным, но если review_date_added единственная проблема, то кажется , как будто вы хотите MAX () этой даты?

Если следующее не помогает, не могли бы вы привести пример данных, пример вывода и описание того, как вы хотите создать вывод?

SELECT
  tbl_products.product_id,
  tbl_products.product_title,
  tbl_brands.brand_name,
  MAX(tbl_reviews.review_date_added) AS review_date_added,
  NOW() AS time_now
FROM
  tbl_products
INNER JOIN
  tbl_reviews
    ON tbl_products.product_id = tbl_reviews.product_id
INNER JOIN
  tbl_brands
    ON tbl_products.brand_id = tbl_brands.brand_id
GROUP BY
  tbl_products.product_id,
  tbl_products.product_title,
  tbl_brands.brand_name
ORDER BY
  MAX(tbl_reviews.review_date_added) DESC
1 голос
/ 08 ноября 2011

Отдельные работы для всего ряда. Скобки только вокруг поля:

distinct (a), b, c  ===  distinct a, b, c

Простое решение - group by. Вы можете использовать min для выбора самой старой даты.

select  tbl_products.product_id
,       min(tbl_products.product_title)
,       min(tbl_brands.brand_name)
,       min(tbl_reviews.review_date_added)
,       NOW() AS time_now
FROM    tbl_products, tbl_reviews, tbl_brands
WHERE   tbl_products.product_id = tbl_reviews.product_id AND
        tbl_products.brand_id = tbl_brands.brand_id
GROUP BY
        tbl_products.product_id
ORDER BY 
        min(tbl_reviews.review_date_added) DESC

Обратите внимание, что если товар может иметь несколько брендов, он выберет самый низкий.

1 голос
/ 08 ноября 2011

Попробуйте это:

SELECT pr.product_id, pr.product_title,
       bd.brand_name, 
      (SELECT MAX(rev.review_date_added) FROM tbl_reviews rev
       WHERE pr.product_id = rev.product_id) AS maxdate, 
       NOW() AS time_now
FROM tbl_products pr INNER JOIN tbl_reviews re 
    ON pr.product_id = re.product_id
INNER JOIN tbl_brands bd
    ON pr.brand_id = bd.brand_id
GROUP BY pr.product_id
ORDER BY re.review_date_added DESC

или (как предложено @Hogan)

SELECT pr.product_id, pr.product_title,
       bd.brand_name, md.maxdate
       NOW() AS time_now
FROM tbl_products pr INNER JOIN tbl_reviews re 
    ON pr.product_id = re.product_id
INNER JOIN tbl_brands bd
    ON pr.brand_id = bd.brand_id
INNER JOIN (SELECT product_id, MAX(review_date_added) AS maxdate 
            FROM tbl_reviews rev GROUP BY product_id) md
    ON pr.product_id = md.product_id
GROUP BY pr.product_id
ORDER BY re.review_date_added DESC
0 голосов
/ 08 ноября 2011

Я объединил ответ Andomar с некоторыми изменениями, которые вы найдете здесь.

SELECT tbl_products.product_id, tbl_products.product_title,
                    tbl_products.product_date_added, tbl_brands.brand_name,
                    MAX(tbl_reviews.review_date_added) AS review_date_added, NOW() AS time_now
            FROM tbl_products, tbl_reviews, tbl_brands
            WHERE tbl_products.product_id = tbl_reviews.product_id AND
                    tbl_products.brand_id = tbl_brands.brand_id
            GROUP BY tbl_products.product_id
            ORDER BY MAX(tbl_reviews.review_date_added) DESC

Прекрасно работает и показывает самую новую дату на tbl_reviews.review_date_added.

С уважением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...