簡體   English   中英

MySql PDO-使用GROUP BY,ORDER BY和INNER JOIN時如何獲取“組中的最新行”?

[英]MySql PDO - How to fetch “newest rows from group” when using GROUP BY, ORDER BY and INNER JOIN?

  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值最低)? 為什么只顯示最早的十個結果? 那是你要的嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM