GROUP BY, ORDER BY - Как создать группу с учетом последнего появления элемента - PullRequest
2 голосов
/ 13 мая 2009

У меня такой запрос (Mysql 5.X, PHP - отформатирован для разборчивости)

$query ="
SELECT 
  p.p_pid, 
  p.p_name, 
  p.p_url 
FROM 
  activity a, 
  products p 
WHERE 
  a.a_uid= ".$uid_int." 
  AND a.a_pid > 0 
  AND p.p_pid = a.a_pid 
GROUP BY 
  a.a_pid 
ORDER BY 
  a.a_time DESC LIMIT 6
");

В целом, он должен создать уникальный список из 6 последних продуктов, которые видел пользователь.

Проблема в том, что если пользователь видел товар более одного раза. один из них в последних 6 действиях и один из них перед последними 6 действиями запрос не возвращает продукт. Я предполагаю, что (group by) не оставляет a_time с последним временем появления продукта. Как я могу это исправить?

Ответы [ 2 ]

2 голосов
/ 13 мая 2009

Вы пробовали заказывать по MAX (a.a_time)?

SELECT 
  p.p_pid, 
  p.p_name, 
  p.p_url 
FROM products p 
INNER JOIN activity a on p.p_pid = a.a_pid 
WHERE 
  a.a_uid= ".$uid_int." 
GROUP BY 
  p_pid, p_name, p_url
ORDER BY 
  max(a.a_time) DESC 
  LIMIT 6

Рекомендуется использовать GROUP BY для каждого столбца, который вы используете, без агрегата. MySQL - одна из немногих баз данных, которая позволяет вам использовать столбец, который не группируется. Это даст вам случайный столбец из выбранных вами строк.

1 голос
/ 13 мая 2009

Я очень надеюсь, что переменная $uid_int дважды проверена на SQL-инъекцию.

$query ="
SELECT 
  MAX(p.p_pid)  p_pid, 
  MAX(p.p_name) p_name, 
  MAX(p.p_url)  p_url
FROM 
  activity a
  INNER JOIN products p ON p.p_pid = a.a_pid 
WHERE 
  a.a_uid= ".$uid_int." 
  AND a.a_pid > 0 
GROUP BY 
  a.a_pid 
ORDER BY 
  MAX(a.a_time) DESC 
LIMIT 6
");

Иногда я задаюсь вопросом, было ли хорошим решением от MySQL разрешить группировку без явного агрегирования ...

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