2012-03-13 6 views
0

Привет У меня проблемы с SQL-запросом. Если бы мне захотелось вывести таблицу так, чтобы она отображала продукты из последнего комментария, сделанного до самого раннего сделанного комментария ... учитывая, что если на выходе есть идентификатор продукта 78, идентификатор продукта 79, идентификатор продукта 81, идентификатор продукта 78, идентификатор продукта 81 , я хочу, чтобы на выходе был идентификатор продукта 78, идентификатор продукта 79, идентификатор продукта 81. В основном я пытаюсь создать страницу, показывающую самую последнюю активность комментариев к продукту.sql query complex ordering by issue

SELECT comments.products_products_id, products.name, products.minilocation, products.users_user_id, 
comments.comment, comment_id, comments.time_stamp, users.username, users.miniavatar FROM products 
INNER JOIN comments ON comments.products_products_id = products.products_id INNER JOIN users ON users.user_id = comments.products_users_user_id 
ORDER BY comments.time_stamp DESC 
+0

Есть комментарии.products_products_id на самом деле comments.products_id? –

+0

Для того, чтобы оставить комментарий, пожалуйста, авторизуйтесь. –

+0

ya все идентификаторы верны. yep в основном просто хочу, чтобы продукт с последним комментарием сверху. dont want any duplicates для идентификаторов продуктов – Anonymous

ответ

2

Зависит, если вы просто хотите самый последний комментарий за product_id, или если вы хотите все комментарии, но только отсортированный по product_id, где продукт с последним комментарием является первым.


Если вы хотите все комментарии, сгруппированных по product_id, где product_ids сортируется в порядке последнего комментария (т.е. посмотреть, как последнее время заказа штампа предложить продукты в порядке (3,1,2):

product_id comment_timestamp 
    3    2012-03-13 
    3    2012-03-09 
    3    2012-03-01 
    1    2012-03-12 
    1    2012-01-01 
    2    2012-03-11 

Тогда вот как вы можете это сделать - узнать последние метки времени для каждого продукта, JOIN, что на ваш основной запрос, и заказ на него:

SELECT comments.products_products_id, products.name, 
     products.minilocation, products.users_user_id, 
     comments.comment, comment_id, comments.time_stamp, 
     users.username, users.miniavatar 
FROM products 
-- NEW JOIN: 
INNER JOIN (SELECT product_id, MAX(time_stamp) as latest 
      FROM comments 
      GROUP BY product_id) latest 
     ON latest.product_id = products.product_id 
-- as before. 
INNER JOIN comments ON comments.products_products_id = products.products_id 
INNER JOIN users ON users.user_id = comments.products_users_user_id 
-- NEW SORT: 
ORDER BY latest.latest DESC, comments.time_stamp DESC 

Новый стол, соединенный с ним, является максимальным (т. самая последняя) отметка времени на идентификатор продукта. Это будет одинаково в пределах одного идентификатора продукта.

Мы сортируем этим первым (сортировать по последнему комментарию метки времени), а затем сортировать по индивидуальному комментарию метки времени в каждый идентификатор продукта.


Если вы хотите самый последний комментарий за product_id, т.е.

product_id comment_timestamp 
    3    2012-03-13 
    1    2012-03-12 
    2    2012-03-11 

Затем используйте:

SELECT comments.products_products_id, products.name, 
     products.minilocation, products.users_user_id, 
     comments.comment, comment_id, comments.time_stamp, 
     users.username, users.miniavatar 
FROM comments 
-- NEW SELF-JOIN 
LEFT JOIN comments c2 ON comments.products_products_id = c2.products_products_id 
        AND comments.time_stamp < c2.time_stamp 
INNER JOIN products ON comments.products_products_id = products.products_id 
INNER JOIN users ON users.user_id = comments.products_users_user_id 
-- new condition 
WHERE c2.time_stamp IS NULL 
ORDER BY comments.time_stamp DESC 

Этот тип запроса называется "величайшая п на группу", и вы в основном присоединитесь к вашей таблице КОММЕНТАРИЙ к себе в пределах каждый product_id. Вы также присоединяетесь к нему так, чтобы одна таблица имела time_stamps меньше, чем другая. Условие WHERE выбирает строки таким образом, что для этого product_id больше нет метки времени, т. Е. Последнего комментария.

+0

Я думаю, это сработало. кроме comment_id, который неоднозначен, и затем я изменил его на comment.comment_id. Мой самый сложный запрос пока. Спасибо. – Anonymous