M2M 表:如何获得与整个对象子组相关的对象?

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

有这些表:

性格:

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 实现。但也许不是...

sql sqlite many-to-many relational-database m2m
© www.soinside.com 2019 - 2024. All rights reserved.