【发布时间】:2014-06-29 04:07:10
【问题描述】:
我有一些表格,其中包含一些(示例)值:
people
----------------------------------
| id | name |
----------------------------------
| 1 | Steve Jobs |
| 2 | Bill Gates |
| 3 | Linus Torvalds |
| 4 | Nikola Tesla |
| 5 | Henry Ford |
----------------------------------
.
groups
----------------------------------
| id | name |
----------------------------------
| 1 | Country |
| 2 | Work |
----------------------------------
.
categories
------------------------------------------
| id | gid | name |
------------------------------------------
| 1 | 1 | USA |
| 2 | 1 | Finland |
| 3 | 1 | Croatia |
| 4 | 2 | Mac |
| 5 | 2 | iPhone |
| 6 | 2 | iPad |
| 7 | 2 | Windows |
| 8 | 1 | Office |
| 9 | 1 | Linux |
| 10 | 1 | Coil |
| 11 | 1 | El. stuff |
| 12 | 1 | Cars |
------------------------------------------
.
people_categories_map
--------------------------
| id | pid | cid |
--------------------------
| 1 | 1 | 1 |
| 2 | 1 | 4 |
| 3 | 1 | 5 |
| 4 | 1 | 6 |
| 5 | 1 | 11 |
| 6 | 2 | 1 |
| 7 | 2 | 7 |
| 8 | 2 | 8 |
| 9 | 2 | 11 |
| 10 | 3 | 2 |
| 11 | 3 | 9 |
| 12 | 3 | 11 |
| 13 | 4 | 1 |
| 14 | 4 | 3 |
| 15 | 4 | 10 |
| 16 | 4 | 11 |
| 17 | 5 | 1 |
| 18 | 5 | 12 |
--------------------------
挑战
我想要实现的是根据每个组的匹配项列出人员。例如,我想列出来自(国家)美国 (categories.id:1) OR 芬兰 (categories.id:2) AND Work Linux (categories.id :9) 或汽车(categories.id:12)。此查询将根据 people_categories_map 表中的关系仅匹配 Linus Torvalds (people.id:3)。
但是,到目前为止,我只设法进行了列出 all 类别匹配或 any 类别匹配的查询,即:
SELECT people.id, people.name FROM people JOIN people_categories_map ON people_categories_map.pid = people.id WHERE people_categories_map.cid IN (1,2);
SELECT people.id, people.name FROM people JOIN people_categories_map ON people_categories_map.pid = people.id WHERE people_categories_map.cid IN (1,9) HAVING COUNT(DISTINCT(people_categories_map.cid)) = 2;
是否有可能以某种方式组合这些,以进行查询,返回将连接到“(category_x OR category_y) AND (category_z OR category_w OR category_m) AND (category_b OR category_c)”的人员列表等等... 换句话说,返回所有组的匹配项?
【问题讨论】:
-
我不确定我是否理解你想要做什么......你能用其他词解释一下吗,或者再举一个例子?
-
感谢您的回复@AlexandreFILLATRE。这是一个实际示例:我想要一个使用“汽车”或“el. stuff”的人员列表,他们必须来自“芬兰”或“克罗地亚”。这将只返回 Linus T。因为这是 people 表中唯一在两个组中都有匹配项的记录(Country 和 Work,匹配 Work:El.stuff 和 Country:Finland)......希望这个例子能解决问题小...
-
这仍然很难理解,但我认为它来自数据模型。为什么你没有 Country 和 Work 表呢?这应该会让事情变得更容易,而且 IMO 会更有意义
-
当然,那会容易得多。但是在 web 应用程序前端,假设使用数据库,可以添加组和类别(每个类别都是组的子)。所以组(或者可能更容易称它为主要类别和子类别)也可以是“公司”、“年龄范围”、“性别”、“城市”、“爱好”、“智商”或其他...换句话说,如果组/主要类别有自己的表,就很难有这种灵活性......但当然,更容易查询......
-
好的。因此,按照您的示例,我看不到 Linus T. 对这两个组都进行了处理。他与类别 2、9 和 11 相关联,它们只是第 1 组的一部分。那么您的示例或数据是错误的,还是我自己错了?
标签: mysql join distinct having database-relations