Mysql

Mysql:查詢預設的訂單和排名(固定/保留條目?)

  • November 10, 2020

我有一個包含我所有產品的產品表。這些產品表被新產品永久填滿。但是,我希望有可能將某些產品“保留”/“固定”到返回的查詢集合中的某個位置。

意味著,我想設置類似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<>在這裡擺弄

引用自:https://dba.stackexchange.com/questions/279433