我想排序我的Posts
dtModified
(datetime修改)如果它不爲空(後修改b4),否則排序dtPosted
(datetime發佈)SQL:如何通過字段,如果它不是空的其他使用另一個字段
回答
好像我放棄這個建議,每週三次在這裏的話,也許我應該放棄,讓它去:-)不,我不這麼認爲:
別牛逼在列計算(或order by
條款)採用每行的功能,如果你希望你的數據庫具有良好的伸縮性。你應該爲你的具體情況(措施,不要猜測),但這樣做的計算性能檢查時閱讀數據庫通常會影響您的擴展能力(這不會不管你的通訊錄數據庫,但商店我的工作有巨大的數據量)。
數「如何讓我的DB走得更快?」問題遠遠超過「我如何使用更少空間?」的數量那些。犧牲磁盤空間以提高性能是一個很好的途徑。
做計算的正確時間是在數據發生變化時。這樣,這些變化的成本就會在所有讀取中攤銷。
我的建議是創建另一列如dtLastAction
包含排序值,那麼如果不爲null使用插入/更新觸發器將其設置爲一樣dtModified
,或dtPosted
如果dtModified
爲null。從技術上講,這違反了3NF,但如果你知道自己在做什麼,那麼沒關係,觸發器保證了數據的一致性。
然後指數在dtLastAction
列,看看您的查詢的速度改善的一些額外的工作插入和更新過程中(較小)的成本。我說,因爲較小的廣大大多數數據庫表的讀取往往比書面(顯然,這個方法沒有用,如果你的特殊情況是非常罕見的例外之一)。
另外,對於這種特殊情況下,你可以創建條目時,這意味着dtModified
永遠是空集dtModified
和dtPosted
爲相同的值。您仍然可以通過這兩個日期時間值相同的事實來檢測從未被修改過的帖子。
是的,我認爲'dtLastAction'是偉大的。也許檢查是否檢查'dtModified'是否與'dtPosted'是相同的。我不需要1個額外的領域。也許把'dtModified'重命名爲'dtLastAction'會讓它更直觀 – 2010-07-31 12:43:34
總的來說我同意降低讀取的成本。但是,這種特殊情況非常簡單,我認爲它並不能證明緩存的所有複雜性。例如。如果行動被刪除,那麼你需要將最後的行動日期更新爲剩餘的最新行動,噩夢! – malhal 2016-10-08 12:23:51
您可以使用COALESCE
:
ORDER BY COALESCE(dtModified, dtPosted)
另一種選擇是使用MySQL特定功能IFNULL
,而不是COALESCE
。
測試在MySQL:
CREATE TABLE table1 (dtModified DATETIME NULL, dtPosted DATETIME NOT NULL);
INSERT INTO table1 (dtModified, dtPosted) VALUES
('2010-07-31 10:00:00', '2010-07-30 10:00:00'),
(NULL , '2010-07-31 09:00:00'),
('2010-07-31 08:00:00', '2010-07-30 10:00:00');
SELECT dtModified, dtPosted
FROM table1
ORDER BY COALESCE(dtModified, dtPosted)
結果:
dtModified dtPosted
2010-07-31 08:00:00 2010-07-30 10:00:00
NULL 2010-07-31 09:00:00
2010-07-31 10:00:00 2010-07-30 10:00:00
你可以在ORDER BY中使用COALESCE嗎? – 2010-07-31 11:26:58
是的,我認爲你必須爲MySQL使用'IFNULL'。 – 2010-07-31 11:28:59
@Daniel Vassallo:我只是在MySQL中測試它,它似乎工作正常。查看我使用的SQL的最新答案。 – 2010-07-31 11:31:08
在你的SELECT,使用CASE語句,採用最新的如果不爲null,否則發佈日期修改的值。然後爲你的ORDER BY使用新的「計算」列。
- 1. 如果一個不是空的其他字段排序2字段
- 2. Drupal Views - 隱藏一個字段,如果其他字段不是空的? /顯示一個字段,除非它爲空,然後顯示一個不同的字段?
- 3. SQL使用某個字段,如果另一個爲空
- 4. 驗證另一個字段,如果文件字段不爲空
- 5. 如何通過另一個字段值驗證字段? Laravel 5.4
- 6. 做一個必填字段,如果其他字段值
- 7. Eval字段,如果空白顯示其他字段
- 8. 如果其他字段不爲空,則使用@pattern
- 9. ASP.NET:如果其他字段不爲空,則跳過運行CompareValidator
- 10. 如何使用order_by如果它是一個t.date或t.decimal字段?
- 11. 隱藏字段,如果它是空
- 12. MongoDB查詢選擇一個字段,如果其他爲空
- 13. 沒有得到一個表中其他字段的所有結果,如果其中一個字段是由
- 14. 如果使用Django或JavaScript選擇其他字段,如何禁用字段?
- 15. SQL - 你如何聚合基於另一個字段的字段
- 16. 如何使其中一個字段指向另一個字段的結構
- 17. 如何通過使用django orm使一個字段值等於同一個表中的另一個字段值?
- 18. 如果其他字段相同,則使用唯一的Mysql字段
- 19. 在MySQL表更新一個字段,如果它是空的
- 20. PHP/MYSQL:我如何計算字段+其他字段+其他字段的值
- 21. 定義結果字段,如果空白,然後另一個字段
- 22. 如果其他字段爲空,則將字段更新爲空或刪除行
- 23. Drupal 7的views_query_alter如果字段爲空的排序與另一個字段
- 24. Report Builder - 字段的平均值(如果另一個字段= X)
- 25. 如何創建一個空字段,如果該字段不存在於MongoDB中
- 26. 如何根據其他字段中的數據啓用/禁用一個字段
- 27. 刪除一些字段之間的空白區域,但不是其他字段
- 28. 如何使用其他表更新一個表的字段?
- 29. django通過一個模型字段通過js添加另一個字段
- 30. 檢查如果一個字段的內容是不是在其他表
排序順序?上升還是下降? – 2010-07-31 11:45:32