2

首先,我很抱歉标题过于模糊,但是我不熟悉此类问题的正确术语。

我正在尝试从维基词典(基于维基媒体维基的词典)中检索页面标题列表,其中页面必须归类为English_lemmas,但不得归类为English_phrasesEnglish_slangEnglish_%_forms(其中 % 是通配符)。

两个必要的表是page包含页面信息 ( page_id, page_title) 的表,以及categorylinks包含每个页面所属的类别的表。

的相关结构page是这样的:

+---------+------------------+
| page_id | page_title       |
+---------+------------------+
| 0       | race             |
| 1       | racing           |
| 2       | that's all folks |
| 3       | fire             |
| 4       | psychédélique    |
+---------+------------------+

的相关结构categorylinks是这样的:(我添加了换行符以便于阅读)

+---------+-------------------------+
| cl_from | cl_to                   |
+---------+-------------------------+
| 0       | English_lemmas          |
| 0       | English_verbs           |

| 1       | English_lemmas          |
| 1       | English_verbs           |
| 1       | English_non-lemma_forms |

| 2       | English_lemmas          |
| 2       | English_phrases         |

| 3       | English_lemmas          |
| 3       | English_nouns           |

| 4       | French_lemmas           |
| 4       | French_adjectives       |
+---------+-------------------------+

wherecategorylinks.cl_from是对类别的直接引用,page.page_id并且categorylinks.cl_to是类别的标题。

我需要选择raceandfire因为它们都被归类在 之下English_lemmas,但不是 racing,或者that's all folks除了都被归类在它们之下之外,English_lemmas它们还分别归类在English_%_formsand之下English_phrases,而不是psychédélique因为它没有归类在之下English_lemmas

因此理想的结果是

+---------+------------------+
| page_id | page_title       |
+---------+------------------+
| 0       | race             |
| 3       | fire             |
+---------+------------------+

这是可以有效实现的吗?如果是这样,我怎样才能做到这一点?

我对 SQL(基本的 SELECT、UPDATE 等语句)有相当基本的了解,所以这样的事情远远超出了我的理解。

4

1 回答 1

2

如果我正确理解了您的要求:

select *
  from page
  where page_id not in (select cl_from from categorylinks
                         where cl_to like 'English_%_forms'
                            or cl_to like 'English_phrases')
    and page_id in (select cl_from from categorylinks
                      where cl_to like 'English_lemmas')
于 2017-12-11T19:19:55.080 回答