簡體   English   中英

如何將 PDO::FETCH_GROUP 與表連接一起使用,並且只返回按日期排序的連接表中的 3 條記錄

[英]How to use PDO::FETCH_GROUP with a table join and only returning 3 records in a joined table ordered by date

我正在使用以下代碼獲取航程類型及其各自航程的分組列表。

public function getVoyageTypesWithTrips() {
//query
$this->db->query('
SELECT voyagetype_name
     , voyagetype_description
     , voyagetype_image
     , voyage_id
     , voyage_name
     , voyage_startDate
  FROM voyagetypes 
  LEFT 
  JOIN voyages 
    ON voyagetypes.voyagetype_id = voyages.voyage_type
 WHERE voyagetype_deleted != 1
');


//get the results
$results = $this->db->resultSetGrouped();
return $results;
}
//get results set as array of objects - grouped
public function resultSetGrouped() {
$this->execute();
return $this->statement->fetchAll(PDO::FETCH_GROUP);
}

我想要做的是將航次表限制為僅顯示到今天最接近的 3 條記錄,而不是返回該類型的所有航次。

所以回歸

  • 1類(下周航次,下周航次,下周航次,沒有更多,但在表中裝載)
  • 2類(明天開航,該類不再)
  • 第 3 類(無航次)

我最初嘗試了 ORDER BY 和 LIMIT 但這不適用於 PDO::FETCH_GROUP 我認為。

我相信我需要在發送到 fetch_group 之前有我的 SQL 訂單和限制連接表??? 所以像

$this->db->query('
SELECT voyagetype_name
     , voyagetype_description
     , voyagetype_image
     , voyage_id
     , voyage_name
     , voyage_startDate
  FROM voyagetypes 
  LEFT 
  JOIN voyages 
    ON voyagetypes.voyagetype_id = voyages.voyage_type
APPLY THE SORT AND LIMIT TO THE JOINED TABLE
WHERE voyagetype_deleted != 1
');

一種選擇是使用子查詢進行過濾:

select vt.voyagetype_name, vt.voyagetype_description, vt.voyagetype_image, v.voyage_id, v.voyage_name, v.voyage_startdate
from voyagetypes vt
left join voyages v 
    on v.voyagetype_id = vt.voyage_type
    and (
        select count(*)
        from voyages v1
        where 
            v1.voyage_type = vt.voyage_type 
            and v1.voyage_startdate > v.voyage_startdate 
    ) < 3
where vt.voyagetype_deleted <> 1

或者,如果您正在運行 MYSQL 8.0,您可以使用rank()

select *
from (
    select 
        vt.voyagetype_name, 
        vt.voyagetype_description, 
        vt.voyagetype_image, 
        v.voyage_id, 
        v.voyage_name, 
        v.voyage_startdate,
        rank() over(partition by vt.voyage_type order by v.voyage_startdate desc) rn
    from voyagetypes vt
    left join voyages v on v.voyagetype_id = vt.voyage_type
    where vt.voyagetype_deleted <> 1
) t
where rn <= 3

暫無
暫無

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

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