首页 > 解决方案 > 通过过滤从多个表中选择数据

问题描述

我有三个表,我需要选择数据。

表之间的关系是多对多的。

ID
1 艾玛 绿色的
2 汤姆 帕蒂森
3 伊恩 汤姆森
4 艾米丽 安德森

活动

ID 姓名
1 音乐
2 烹饪
3 足球

人员_活动

person_id 活动编号
1 1
1 2
2 2
2 3
3 3
4 1
4 2
4 3

我需要从人员和活动表中选择所有内容,但只能按活动名称过滤。因此,activity 为 Football 时的结果必须是下一个:

person_id 活动编号 活动名称
2 汤姆 帕蒂森 2 烹饪
2 汤姆 帕蒂森 3 足球
3 伊恩 汤姆森 3 足球
4 艾米丽 安德森 1 音乐
4 艾米丽 安德森 2 烹饪
4 艾米丽 安德森 3 足球

我的查询看起来像下一个,但它没有过滤并返回所有人。

SELECT p.person_id, first_name, last_name, a.activity_id, activity_name FROM persons p 
JOIN persons_activities pa ON p.person_id = pa.person_id 
JOIN activities a ON a.activity_id = pa.activity_id 
ORDER BY p.person_id, a.activity_id;

只有 person_id 映射到带有来自 persons_activities 表的 activity_name 的 activity_id 的人员才应返回。正确的查询必须是什么样子?

标签: javasqlpostgresql

解决方案


据我了解,您的问题是如何正确过滤使用您的联接查询为给定的活动名称创建的虚拟表:

您连接表的查询:

``
SELECT p.person_id, first_name, last_name, a.activity_id, activity_name FROM persons p 
JOIN persons_activities pa ON p.person_id = pa.person_id 
JOIN activities a ON a.activity_id = pa.activity_id 
ORDER BY p.person_id, a.activity_id;
``

过滤此虚拟表的建议:

1.你可以在条件中使用LIKE子句,WHERE以防你只知道列的值而不知道它的id。

查询过滤activity_name(你不知道id):

``
SELECT p.person_id, first_name, last_name, a.activity_id, activity_name FROM persons p 
JOIN persons_activities pa ON p.person_id = pa.person_id 
JOIN activities a ON a.activity_id = pa.activity_id 
WHERE a.activity_name LIKE '%Football%';
``

2.如果您知道特定列的 id,则可以使用该列WHERE

查询过滤activity_name(你知道id):

``
SELECT p.person_id, first_name, last_name, a.activity_id, activity_name FROM persons p 
JOIN persons_activities pa ON p.person_id = pa.person_id 
JOIN activities a ON a.activity_id = pa.activity_id 
WHERE a.activity_id=3;
``

推荐阅读