我有一張桌子
-- Table Definition ----------------------------------------------
CREATE TABLE rooms (
id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
user_id_one uuid NOT NULL REFERENCES users(user_id) ON DELETE CASCADE,
user_id_two uuid NOT NULL REFERENCES users(user_id) ON DELETE CASCADE,
create_time timestamp with time zone NOT NULL DEFAULT now()
);
-- Indices -------------------------------------------------------
CREATE UNIQUE INDEX room_pkey ON rooms(id int4_ops);
我想得到rooms.id一對特定的user_ids。
這樣做的最佳方法是什么?
1.
SELECT r.id
FROM rooms r
WHERE '9af0521d-f999-42e8-aafd-4bf2d839eafb' in (user_id_one, user_id_two)
AND '0ff77b22-62f9-44ce-8f2e-7e85726dbb3e' in (user_id_one, user_id_two)
SELECT r.id
FROM rooms r
WHERE user_id_one in ('9af0521d-f999-42e8-aafd-4bf2d839eafb', '0ff77b22-62f9-44ce-8f2e-7e85726dbb3e')
AND user_id_two in ('9af0521d-f999-42e8-aafd-4bf2d839eafb', '0ff77b22-62f9-44ce-8f2e-7e85726dbb3e')
SELECT r.id
FROM rooms r
WHERE (
(user_id_one = '9af0521d-f999-42e8-aafd-4bf2d839eafb'
AND user_id_two = '0ff77b22-62f9-44ce-8f2e-7e85726dbb3e')
OR
(user_id_one = '0ff77b22-62f9-44ce-8f2e-7e85726dbb3e'
AND user_id_two = '9af0521d-f999-42e8-aafd-4bf2d839eafb')
)
還是完全不同的東西?
uj5u.com熱心網友回復:
假設這兩個用戶 ID 永遠不會具有相同的值,那么您的所有三個版本都是有效的。我可以建議另一個版本,也許比你已經擁有的更簡潔:
SELECT id
FROM rooms r
WHERE LEAST(user_id_one, user_id_two) = '0ff77b22-62f9-44ce-8f2e-7e85726dbb3e' AND
GREATEST(user_id_one, user_id_two) = '9af0521d-f999-42e8-aafd-4bf2d839eafb';
上述最小/最大方法是用一塊石頭殺死兩只鳥的技巧。無論匹配的 ID 集以何種順序出現,上述方法都有效,通過斷言較小的 UUID 顯示為一個用戶 ID,而較大的 UID 顯示為另一個用戶 ID。
uj5u.com熱心網友回復:
您可以通過陣列進行比較:
WHERE ARRAY [user_id_one,user_id_two] @> ARRAY ['9af0521d-f999-42e8-aafd-4bf2d839eafb','0ff77b22-62f9-44ce-8f2e-7e85726dbb3e']
這是dbfiddle示例
uj5u.com熱心網友回復:
我會更改您的第二個查詢,以便您傳遞您只想要一次的一對 uuid:
SELECT id
FROM rooms
WHERE (?, ?) IN ((user_id_one, user_id_two), (user_id_two, user_id_one));
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/482495.html
標籤:sql PostgreSQL
上一篇:用于從多行中提取單行的SQL查詢
