我有一个这样的查询(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留下最新的产品上架时间。我该如何纠正?
答案 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是否是一个很好的设计决策,允许在没有明确聚合的情况下进行分组......