MySql PDO - 如何在使用GROUP BY,ORDER BY和INNER JOIN时从组中获取“最新行”?

时间:2014-07-21 15:40:19

标签: 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)?

我是否必须更改整个查询,或者我错过了哪些内容?

1 个答案:

答案 0 :(得分:3)

您对MySQL中称为GROUP BY扩展名的恶意错误感到困惑。读这个。 http://dev.mysql.com/doc/refman/5.6/en/group-by-extensions.html

您希望为group_id的每个值定义为 latest 的行。这些行实际上是具有最高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值)?为什么只显示最早的十个结果?这就是你想要的吗?