php - MySql PDO - 使用 GROUP BY、ORDER BY 和 INNER JOIN 时如何获取 "newest rows from group"?

标签 php mysql sql pdo

      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/

相关文章:

javascript - 在设定的时间向下滚动聊天,但在用户交互时停用

php - 每当我重新加载/刷新我的页面时,它都会使 mysql 查询加倍? [PHP]

sql - SOLID 存储过程和函数

java - 如何使用 Java 中的 SQL 修复已创建的表和值未显示在控制台中的问题?

MySQL选择默认值

php - 是否可以仅对 MySQL 的临时表授予插入、更新和删除权限?

php - 有什么技巧可以在 Wordpress 中使用 Yii 吗?

php - 如何将浮点值填充到通过使用 MYSQL C++ API 编写的插件提供的虚拟表的浮点类型列而不进行裁剪?

PHP 函数反序列化在字符集更改后停止工作(从 latin1 到 UTF-8)

未在新 session 上设置 MySQL 查询变量