Select 行基于单独存储的信息 table

Select rows based on information stored in separate table

首先,对于过于模糊的标题,我深表歉意,但我不熟悉此类问题的正确术语。

我正在尝试从 Wiktionary(维基媒体 wiki-based 词典)中检索页面标题列表,其中页面必须归类在 English_lemmas 下,但必须 而不是 归入 English_phrasesEnglish_slangEnglish_%_forms(其中 % 是通配符)。

两个必需的表是包含页面信息(page_idpage_title)的 page 和包含每个页面所属类别的 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       |
+---------+-------------------------+

其中 categorylinks.cl_from 是对 page.page_id 的直接引用,categorylinks.cl_to 是类别的标题。

我需要 select racefire,因为它们都属于 English_lemmas,但 不是 racingthat's all folks 因为除了都归入 English_lemmas 之外,它们还分别归入 English_%_formsEnglish_phrases,而不是 psychédélique未归入 English_lemmas.

因此理想的结果是

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

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

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

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

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')