GROUP BY,ORDER BY - 如何通过考虑项目的最新外观来制作组

时间:2009-05-13 09:37:13

标签: sql mysql

我有一个这样的查询(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 个答案:

答案 0 :(得分:2)

您是否尝试过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 :(得分:1)

我确信希望$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是否是一个很好的设计决策,允许在没有明确聚合的情况下进行分组......