products_table: | p_id | name | | 1 | name1 | | 2 | name2 | | 3 | name3 | favourites_table: | id | p_id | deleted | group_id | fetch-> | 1 | 1 | 0 | 11 | | 2 | 1 | 0 | 11 | fetch-> | 3 | 2 | 0 | 22 | | 4 | 2 | 0 | 22 | fetch-> | 5 | 3 | 0 | 33 | | 6 | 3 | 0 | 33 |
$sth = $db->prepare(' SELECT a.p_id, b.name
FROM favourites_table AS a
INNER JOIN products_table AS b
ON a.p_id = b.p_id
WHERE a.deleted=0
GROUP BY a.group_id
ORDER BY a.id ASC
LIMIT 0, 10;');
$sth->execute();
while(($query_data = $sth->fetch()) !== false) {
echo $query_data['p_id'] . ':' . $query_data['name'] . '<br>';
}
此查询从“favourites_table”中获取第 1、3、5 行。
如何更改它以获取“最新行”(2、4、6)?
我是否必须更改整个查询,或者我是否遗漏了什么?
最佳答案
您对 MySQL 中名为 GROUP BY
扩展的有害错误功能感到困惑。读这个。 http://dev.mysql.com/doc/refman/5.6/en/group-by-extensions.html
您希望为 group_id
的每个值定义为最新 的行。这些行实际上是具有最高 id
值的未删除行。
因此,首先您需要使用子查询——一个虚拟表——来查找这些行,如下所示:
SELECT MAX(id) AS id, group_id FROM favourites_table WHERE deleted = 0 GROUP BY group_id
然后,您需要使用该结果集在主查询中查找正确的行。你会这样做:
SELECT a.p_id, b.name
FROM favourites_table AS a
INNER JOIN products_table AS b ON a.p_id = b.p_id
INNER JOIN (
SELECT MAX(id) AS id, group_id FROM favourites_table WHERE deleted = 0 GROUP BY group_id
) AS c ON a.id = c.id
GROUP BY a.group_id
ORDER BY a.id ASC
LIMIT 0, 10
这应该会得到您的结果。
问题:为什么要先排列最旧的(最低的 id
值)?为什么只显示最旧的十个结果?这是你想要的吗?
关于php - MySql PDO - 使用 GROUP BY、ORDER BY 和 INNER JOIN 时如何获取 "newest rows from group"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24869097/