Mysql
Mysql:查詢預設的訂單和排名(固定/保留條目?)
我有一個包含我所有產品的產品表。這些產品表被新產品永久填滿。但是,我希望有可能將某些產品“保留”/“固定”到返回的查詢集合中的某個位置。
意味著,我想設置類似
rank_index
的內容,其中包含產品在返回的查詢集合中應具有的數字。例子:
id title rank_index 1 An awesome product 2 Another product 3 3 Baby car 4 Green carpet 1 5 Toy
讓我們假設預設順序是
id
,降序。但下降?因為正如我指出的那樣,產品表中永遠充滿了新產品,我總是想在最上面展示最新的產品。但是,例如,當一個產品的 arank_index
為 2 時,無論新產品寫入數據庫的金額是多少,數據庫都應該將此條目作為第二個返回!上表的結果將是:
id title rank_index 4 Green carpet 1 5 Toy 2 Another product 3 3 Baby car 1 An awesome product
這是否可以做到(沒有遞歸)?該
rank_index
專欄只是我的一個想法。我的意思是..我也可以在php
一邊做這個並做一個正常的查詢,它只包括products
沒有一個rank_index
和一個只包含products
一個index_rank
並在旁邊手動訂購它們的查詢php
。你會推薦這個嗎?那會更快嗎?此外,後來我想添加一個
perfomance_index
不是 +1 遞增索引,而是顯示產品性能的索引。如果這對這個問題有任何影響,也應該按降序排序。這在這裡做得很好,但僅適用於升序表,我想要一個帶有永久添加產品的降序表!
SELECT * FROM table ORDER BY IF(rank_index IS NULL, id, rank_index - 0.5)
順便說一句:如果這有什麼不同,我正在使用 Laravel 8。
親切的問候
您可以通過 IF ot CASE 添加到 ORDER BY 中,具體取決於復雜性或新訂單。
在您的情況下,您需要將 max(id) 添加到組合中
CREATE TABLE table1 ( `id` INTEGER, `title` VARCHAR(18), `rank_index` VARCHAR(4) ); INSERT INTO table1 (`id`, `title`, `rank_index`) VALUES ('1', 'An awesome product', NULL), ('2', 'Another product', '3'), ('3', 'Baby car', NULL), ('4', 'Green carpet', '1'), ('5', 'Toy', NULL);
SELECT t1.id, t1.`title`,t1.`rank_index` FROM table1 t1 CROSS JOIN ( SELECT MAX(id) maxid FROM table1) t2 ORDER BY IF(rank_index IS NULL, maxid - id + 1 , rank_index - 0.5) ASC
編號 | 標題 | rank_index -: | :----------------- | :--------- 4 | 綠地毯 | 1 5 | 玩具 | *空值* 2 | 另一個產品 | 3 3 | 嬰兒車 | *空* 1 | 一個很棒的產品| *空值*
db<>在這裡擺弄