2012-03-23 31 views
3

我有兩個表返回標識existings的不同列表中的所有子集

Table "public.tags_to_entities" 
Column | Type | Modifiers 
--------+---------+----------- 
tid | integer | not null 
eid | integer | not null 

    Table "public.tag_tree" 
Column | Type | Modifiers 
--------+---------+----------- 
tid | integer | not null 
pid | integer | not null 
level | integer | 

tag_tree包含標籤之間的所有關係,這意味着SELECT pid FROM tag_tree WHERE tid = ?將返回該標籤的父母。只有level列或ORDER BY

我想返回所有eid的列表,其中每個標籤子集都至少包含一個標籤。做一個子集使用下面的查詢

SELECT DISTINCT eid 
FROM tags_to_entities 
WHERE 
    tags_to_entities.tid = 1 OR 
    tags_to_entities.tid IN (SELECT tag_tree.tid FROM tag_tree WHERE tag_tree.pid = 1)); 

這將返回所有eid現有標籤1或其子標籤的作品之一。如果我想返回與12相關的至少一個標籤中存在的所有eid。到目前爲止,我的失敗方法是

SELECT DISTINCT eid 
FROM tags_to_entities 
WHERE 
    (
     tags_to_entities.tid = 1 OR 
     tags_to_entities.tid IN (SELECT tag_tree.tid FROM tag_tree WHERE tag_tree.pid = 1)) AND 
    (
     tags_to_entities.tid = 2 OR 
     tags_to_entities.tid IN (SELECT tag_tree.tid FROM tag_tree WHERE tag_tree.pid = 2)); 

這不起作用,因爲tid不能同時爲1和2。我該如何解決這個問題? (eid將在稍後與條目表結合)

回答

1

您需要使用GROUP BY而不是DISTINCT。這使您可以使用聚合函數和HAVING子句。

SELECT 
    map.eid 
FROM 
    tags_to_entities AS map 
INNER JOIN 
    tag_tree   AS tree 
    ON map.tid = tree.tid 
WHERE 
    (tree.tid = 1 OR tree.pid = 1) 
    OR (tree.tid = 2 OR tree.pid = 2) 
GROUP BY 
    map.id 
HAVING 
    COUNT(DISTINCT CASE WHEN (tree.tid = 1 OR tree.pid = 1) THEN 1 
         WHEN (tree.tid = 2 OR tree.pid = 2) THEN 2 
       END) 
    = 2 

JOINWHERE條款獲得,他們有標籤12所有實體。但是,然後將它們分組在一起,然後計算這些標籤所處的分類數量。只有當它爲2時,實體才能通過HAVING條款。

+0

'GROUP BY map.id'應該是_eid_或_tid_,我假設_eid_? – runfalk 2012-03-23 17:35:15

+0

將'GROUP BY map.id'切換到'GROUP BY map.eid',它的工作方式與預期相同。謝謝! – runfalk 2012-03-23 20:12:43

+0

@antennen - yup,sorry,'eid';) – MatBailie 2012-03-23 21:33:01

相關問題