2012-07-04 43 views
1

假設我有三個表格,一個用戶表格,一個包含約500個不同項目的表格和相應的連接表格。我想這樣做的是:AND條件爲多對多

select * from users u join items_users iu on iu.user_id = u.id 
where iu.item_id in (1,2,3,4,5) 
and u.city_id = 1 limit 10; 

除,而不是IN條件下,我想找到有所有相應項目的用戶。如果有幫助的話,假設一次搜索的項目數量最大爲5個。此外,我使用的是Postgres,如果能夠提供幫助的話,並不介意對它進行非規範化處理,因爲它是隻讀系統,速度最高優先。

回答

0

這是關係部門的另一種情況。我們已經組裝了相當多的查詢庫來處理這類問題here

在這種情況下,有5名或更多的項目,我可能會嘗試:

SELECT u.* 
FROM users AS u 
WHERE u.city_id = 1 
AND EXISTS (
    SELECT * 
    FROM items_users AS a 
    JOIN items_users AS b USING (user_id) 
    JOIN items_users AS c USING (user_id) 
    ... 
    WHERE a.user_id = u.user_id 
    AND a.item_id = 1 
    AND b.item_id = 2 
    AND c.item_id = 3 
    ... 
    ) 
LIMIT 10; 

這是在我的測試中最快的一種,它正好符合多種標準的要求上items_users而只有從user返回列。

閱讀關於indexes at the linked answer。這些對性能至關重要。 由於您的表格是隻讀的,我還會使用CLUSTER兩個表格,以儘量減少必須訪問的頁面數量。如果沒有別的,CLUSTER items_users使用(user_id, item_id)上的多列索引。

+0

感謝您的幫助。 –