SQL запрос сложный порядок по вопросу - PullRequest
0 голосов
/ 13 марта 2012

Привет, у меня проблемы с запросом SQL. Если бы я хотел вывести таблицу так, чтобы в ней отображались продукты от последнего комментария до самого раннего сделанного комментария ... имейте в виду, что если выходные данные - это идентификатор продукта 78, идентификатор продукта 79, идентификатор продукта 81, идентификатор продукта 78, идентификатор продукта 81 Я хочу, чтобы выходные данные были идентификатором продукта 78, идентификатором продукта 79, идентификатором продукта 81. По сути, я пытаюсь создать страницу, на которой отображаются последние комментарии к продукту.

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

1 Ответ

2 голосов
/ 13 марта 2012

Зависит от того, хотите ли вы только самый последний комментарий для 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

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

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. Вы также присоединяетесь к нему таким образом, что у одной таблицы метки времени меньше, чем у другой. Условие WHERE выбирает строки таким образом, что для этого product_id больше нет отметки времени, то есть самого последнего комментария.

...