我有四张 table
alert:
* monitor_id
* group_id
group:
* group_id
user:
* user_id
* email
user_group:
* group_id
* user_id
是否可以仅使用 monitor_id 来获取用户的邮件?
如是!是否可能仅在一个查询中?
无论是通过sql查询还是 Doctrine ,请帮助我!
最佳答案
正确查询:
SELECT DISTINCT user.email FROM user
inner join user_group on user.user_id=user_group.user_id
inner join alert on alert.group_id=user_group.group_id
where alert.monitor_id = provided_monitor_id
上一篇有 Shahbaz 的评论。
SELECT * FROM user inner join user_group on user.user_id=user_group.user_id
inner join group on user_group.group_id=group.group_id inner
join alert on alert.group_id=group.group_id
group by user.user_id
编辑(Shahbaz):帮助解释命令的工作原理:
当你有两个表共享一个字段(如果你喜欢一个变量),你可以
join
这两个表(也称为 inner join
),从而将两个表中的数据组合成一个更大的表(如果没有共享字段,您甚至可以这样做)。让我们用一个例子来看看:表人员:字段:pid、pname、pjob
有条目
表作业:字段:jname、jpay
有条目
现在如果你说
People join Jobs
你会得到一个有 9 个条目的表格,其中包含:字段:pid、pname、pjob、jname、jpay
有条目
如您所见,这不是一张好 table !您可以使用
on
join
中的条件提取彼此相关的信息。例如,我们可能想查看每个人的工资。因此,People.pjob 应该等于 Jobs.jname 所以,如果你说 People join Jobs on People.pjob=Jobs.jname
你得到一张 table :字段:pid、pname、pjob、jname、jpay
有条目
请注意,Clara 的工作在 Jobs 表中不存在,因此她不在决赛 table 中。
而
inner join
为您提供来自匹配的两个表的数据,即使另一侧没有匹配项,您也可能希望获取表的数据。这称为 outer join
.在此示例中 People outer join Jobs
产生一个表字段:pid、pname、pjob、jname、jpay
有条目
null
,null
)null
, null
, null
, '老师', 1000) 如果您只想要
outer join
左侧的表格即使不匹配也要包含在内,请使用 left outer join
(在这种情况下,将出现“Clara”行而不是“teacher”行)。同样,right outer join
给出右表中的行,即使不匹配,但不给出左表。最后,你一定已经知道了
select
确实,它只是从提供的列中返回一个包含选定列的表(*
选择所有列)。给定的表可能只是一个表的名称,或者是由 sql 命令形成的任何其他表(使用 select
命令本身创建的表(在这种情况下不要犹豫使用括号),使用 join
命令创建的表等)。如果您了解 SQL 的这种递归性质,您可以创建任意复杂的命令。试想一下,对表的每个操作都会产生另一个表,您可以简单地将其与其他操作结合使用,就好像该表是一个简单的存储命名表一样!
关于mysql - 4张表的SQL查询: Very Complex?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7201578/