一對多關系中的分頁查詢和過濾:如何高效解決JOIN和第一范式沖突?

一對多關系中的分頁查詢和過濾:如何高效解決JOIN和第一范式沖突?

業務關系為一對多的分頁查詢與多側條件過濾

在業務系統中,經常會遇到一對多的關系,并且需要分頁查詢和根據多側條件進行過濾的需求。針對這種情況,需要設計合理的數據庫表結構和查詢方案來高效獲取數據。

本文提出的兩種設計方案均存在一定的問題:

  • 第一種方案:將數據分散在兩張表中,雖然滿足了第一范式,但分頁查詢時需要通過 join 操作,數據量較大時性能可能受影響,且查詢條件過濾不準確。
  • 第二種方案:將數據存儲在單表中,違反了第一范式,數據量大時可能存在性能問題,且 like 查詢結果不夠準確。

為了解決這些問題,可以采用以下優化方案:

select *, (select group_concat(tag) from tag where user_id = user.id and tag = '活潑') as tags from user where exists(select 1 from tag where user_id = user.id and tag = '活潑' limit 1) limit #{current}, #{size};

這個方案利用了 sql 中的exists和group_concat函數:

  • exists判斷是否存在滿足條件的記錄,避免了不必要的 join 操作。
  • group_concat將匹配的標簽進行拼接,方便后續處理。

因此,該查詢可以高效地進行分頁查詢并根據多側條件過濾數據,保證查詢結果的準確性。

? 版權聲明
THE END
喜歡就支持一下吧
點贊13 分享