复杂SQL连接根据给定结构查询

问题描述 投票:0回答:3

我有两张桌子postscategory_relationships。我需要根据以下逻辑得到一些复杂的结果。

帖子表

id   |      post  
-----|------------------------------|
1000 | Lorem ipsum dolor sit amet   | 
1001 | consectetur adipiscing elit  | 
1002 | sed do eiusmod tempor  ut    | 
1004 | abore et dolore magna aliqua | 

category_relationships表

post_id    cat_id  
---------|---------|
   1000  |   201   | 
   1000  |   202   | 
   1000  |   211   | 
   1001  |   201   | 
   1001  |   211   | 
   1002  |   202   | 
   1002  |   212   | 

首先,我将尝试解释我的类别结构。我有三级结构如下。 (为了简单起见,我这里不包括任何类别表)

flight [level 1] [ID : 100]
    - class      [level 2] [ID : 200]
        -- economy  [level 3] [ID : 201]
        -- business [level 3] [ID : 202]
        -- first    [level 3] [ID : 203]
    - alliance   [level 2] [ID : 210]
        -- star     [level 3] [ID : 211]
        -- oneworld [level 3] [ID : 212]
        -- skyteam  [level 3] [ID : 213]

现在算法:

我需要根据以下规则将所有帖子标记为flight类别或任何儿童/儿童。

我需要排除标记为economy的帖子(ID:201);

  1. 但是,如果其中一个兄弟姐妹(businessfirst)被标记,它仍然应该在结果集中。
  2. 它不应该考虑alliance或其子/孩子被标记的帖子如果economy也标记在相同的帖子

请注意,我可以根据结构获取类别ID并在查询中使用它们。

到目前为止我的方法:

SELECT posts.ID FROM posts  
LEFT JOIN category_relationships AS tt1 ON (posts.ID = tt1.post_id) 
WHERE tt1.cat_id IN (100,200,201,202,203,210,211,212,213) 
AND posts.ID NOT IN ( SELECT post_id FROM category_relationships WHERE cat_id IN (201) ) 

但问题是它删除了所有标记为economy的帖子。但是它没有达到规则1。

理想的结果集就像吼叫;

1000 - rule number 1
1002 - anyway no `economy` tagged

不包括:

1001 - rule number 2
1004 - no tagged

希望你对这个问题有清晰的认识,任何帮助都会非常值得欣赏。

mysql sql database jointable
3个回答
© www.soinside.com 2019 - 2024. All rights reserved.