Query
使用 OR 或 IN 子句查詢有序列表
我正在
items
從數據庫中查詢並將其顯示給使用者。(在我的範例中,我將contacts
在 table 中使用tContacts
。使用者按照他決定的順序選擇幾個
items
(使用者可以隨機選擇項目,因此不能指定要排序的列)。在應用程序中,我
items
有ordered list
.目前我查詢這些對象的更多詳細資訊
one-by-one
。是否可以使用“有序列表”創建查詢,它
items
以相同的順序返回?類似的東西(是的,這很醜 - 可能也達到了最大 sql 查詢大小):
SELECT * FROM ( --how to append this list... SELECT 0 as listIndex, * from tContacts where conIdContact = 13259; SELECT 1 as listIndex, * from tContacts where conIdContact = 12472; [...] SELECT 568 as listIndex, * from tContacts where conIdContact = 12422; ) ORDER BY listIndex
- 或者:我是否必須繼續查詢
one-by-one
- 或:這是否需要一個臨時表(插入 id 和優先級),然後查詢,然後再次刪除臨時表。
- 或:查詢 a**
batch
**並重新排序應用程式碼中的項目(由於列表可能很大,這可能會很慢)注意:首選獨立於數據庫的解決方案(mariadb / mysql、postgresql 和 h2 被認為用於生產。
我的臨時表概念:
CREATE TEMPORARY TABLE temp_OrderedContacts( listIndex INT NOT NULL DEFAULT 0, contactId INT NOT NULL DEFAULT 0 ); INSERT INTO temp_OrderedContacts (listIndex, contactId) VALUES (0,13259), (1,12472), (2,12422); SELECT * FROM tContacts JOIN temp_OrderedContacts ON (tContacts.conIdContact = temp_OrderedContacts.contactId) DROP TABLE temp_OrderedContacts;
Postgres 解決方案是將所有 ID 放入一個數組中,然後使用如下內容:
select t.*, il.listindex from contacts t join unnest(array[13259, 12472, ..., 12422]) with ordinality as il(id, listindex) on t.conidcontact = il.id order by il.listindex;
(上面實際上是標準的 ANSI SQL - 但據我所知只有 Postgres 和 HSQLDB 支持)
該數組也可以作為準備好的語句中的參數傳遞(或您使用的程式語言中的任何術語)。
如果您可以建構動態查詢,另一種選擇是使用行值建構子:
select t.*, il.listindex from contacts t join ( values (1, 13259), (2, 12472), ..... (568, 12422) ) as il(listindex, id) on t.conidcontact = il.id order by il.listindex;
(以上為100%標準ANSI SQL)