如何合并多個包含相同查詢模式的 sql 語句?
在某些情況下,我們需要對同一張表執行多個具有相同查詢模式的 sql 語句。傳統的解決方案是編寫多條單獨的語句,但這可能很繁瑣且容易出錯。本文將介紹兩種方法,將多個 sql 語句合并為一個更簡潔、更強大的查詢。
方法 1:基于窗口函數(mysql >= 8.0)
如今版本的 mysql(8.0 及更高版本)支持窗口函數,這允許我們對行組執行計算并按行對結果進行排序。對于給定的問題,我們可以使用以下查詢:
with ranked_data as ( select *, count(*) over (partition by title, mark) as count, row_number() over (partition by mark order by count(*) desc) as row_num from t_search where mark between 'a' and 'z' group by title, mark ) select * from ranked_data where row_num <= 20 order by mark, count desc;
登錄后復制
此查詢使用窗口函數 count() 和 row_number() 計算每個標題-標記對的計數和行號。然后,它僅選擇前 20 行(對于每個標記)并按標記和計數遞減順序排序。
方法 2:基于變量(mysql
對于不支持窗口函數的 mysql 版本(低于 8.0),另一種方法是使用變量來跟蹤查詢中的狀態。以下查詢使用此技術:
SELECT * FROM ( SELECT *, @rank := IF(@prev_mark = mark, @rank + 1, 1) AS rank, @prev_mark := mark, COUNT(*) AS count FROM t_search JOIN (SELECT @rank := 0, @prev_mark := '') AS vars WHERE mark BETWEEN 'a' AND 'z' GROUP BY title, mark ORDER BY mark, count DESC ) AS ranked_data WHERE rank <= 20 ORDER BY mark, count DESC;
登錄后復制
此查詢使用用戶定義變量 @rank 和 @prev_mark 來跟蹤每個標記的當前排名和以前遇到的標記。然后,它按標記和計數遞減順序對結果進行排序,并僅選擇前 20 行。
這兩種方法都可以將多個 sql 語句合并為一個更簡潔、更有效的查詢,從而簡化了代碼并提高了性能。