有这些表:
性格:
id | name
---------
1 | 泉
2 | 線
3 | 缐
4 | 冰
5 | 白
6 | 正
激进的:
id | name
------
1 | 白
2 | 水
我有几个像这样的连接点,就像在任何多对多的一组表中一样:
char_id | rad_id
-----------------
1 | 1
1 | 2
2 | 1
2 | 2
3 | 1
3 | 2
4 | 2
5 | 1
部首基本上是汉字的一部分。我想建立一个查询,可以同时返回与部首“水”和“白”相关的字符。
现在,这个查询:
SELECT DISTINCT c.* FROM `character` as c
INNER JOIN `junction_table` AS jt ON jt.char_id = c.id
INNER JOIN `radical` AS r ON jt.rad_id = r.id
WHERE r.name IN("白","水");
此查询将执行我想要实现的相反类型的过滤。这将返回与“白”或“水”相关的任何字符,但我只想要与“白”和“水”相关的字符。
我试着想象如何用尽可能少的查询来解决这个问题,但是我的想象力已经耗尽了。凭借我自己的 SQL 经验,我无法弄清楚任何事情,这对于同时针对不仅 2 个部首,而且针对任意数量的部首 (N) 的查询来说已经足够可靠了。
这是一个 SQL Fiddle 我创建的唯一目的是通过一个简化的示例来揭示这个问题,并且可以作为任何人的沙箱。
我希望这可以通过纯 SQL 实现。但也许不是...