我在Mysql中有三个表链接在一起:
Profile (ID, Name, Stuff.)
与 (ID、ProfileID desc奥德)
<地址/strong> (ID、ProfileID desc奥德)
现在我需要从概要表中选择所有概要,其中联系人和地址中的“desc”
字段Ord = 1。这是一个搜索函数,我将在一个表中显示客户的姓名、主要联系信息和主要地址。
我现在可以用三个单独的SQL请求来完成:
SELECT Name, ID FROM Profile WHERE name=”bla”
然后在foreach循环中,我将运行另外两个请求:
SELECT ProfileID, desc FROM Contact WHERE ProfileID=MyProfileID AND Ord=1
SELECT ProfileID, desc FROM Address WHERE ProfileID=MyProfileID AND Ord=1
我知道您可以在一个查询中执行多个SELECT
,是否有一种方法可以将所有三个SELECT
分组到一个查询中?
您应该能够在其他表的profile.id
和profileid
上JOIN
表。
如果您确定profileid
在所有三个表中都存在,那么您可以使用INNER JOIN
。INNER JOIN
返回所有表中匹配的行:
select p.id,
p.name,
c.desc ContactDesc,
a.desc AddressDesc
from profile p
inner join contact c
on p.id = c.profileid
inner join address a
on p.id = a.profileid
where p.name = 'bla'
and c.ord = 1
and a.ord = 1
如果您不确定是否有匹配的行,那么您可以使用LEFT JOIN
:
select p.id,
p.name,
c.desc ContactDesc,
a.desc AddressDesc
from profile p
left join contact c
on p.id = c.profileid
and c.ord = 1
left join address a
on p.id = a.profileid
and a.ord = 1
where p.name = 'bla'
如果你需要学习JOIN
语法的帮助,这里有一个很好的连接的可视化解释
下面的查询仅当Profile
表中的ID
在Contact
和Address
表上至少有一个匹配时才选择列。如果它们中的一个或两个都是可空的,则使用LEFT JOIN
而不是INNER JOIN
,因为LEFT JOIN
显示来自左副表的所有记录,而不管它是否在其他表上有匹配。
SELECT a.*,
b.desc as BDESC,
c.desc as CDESC
FROM Profile a
INNER JOIN Contact b
ON a.ID = b.ProfileID
INNER JOIN Address c
ON a.ID = c.ProfileID
WHERE b.ORD = 1 AND
c.ORD = 1 AND
a.Name = 'nameHERE'
LEFT JOIN
版本:
SELECT a.*,
b.desc as BDESC,
c.desc as CDESC
FROM Profile a
INNER JOIN Contact b
ON a.ID = b.ProfileID AND b.ORD = 1
INNER JOIN Address c
ON a.ID = c.ProfileID AND c.ORD = 1
WHERE a.Name = 'nameHERE'
要进一步了解连接,请访问下面的链接:
- SQL连接的可视化表示
我已经根据您的要求创建了工作演示:
下面的查询将从数据库检索所有匹配的记录。它检索配置文件id,名称内容和联系人表的描述
select p.id,p.name,p.stauff,c.descr,a.descr from profile as p
inner join contact as c on c.profileid=p.id
inner join address as a on a.profileid=p.id
where p.name="bla" and c.ord=1 and a.ord=1