我在Mysql中有三个链接在一起的表:
资料(身份证,姓名,资料......)
联系(ID,ProfileID,desc,Ord)
地址(ID,ProfileID,desc,Ord)
现在我需要从配置文件表中选择所有配置文件,其中“desc”
字段来自Contact和Address,其中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
分组到一个查询中?
答案 0 :(得分:5)
您应该JOIN
profile.id
上的表格和其他表格中的profileid
。
如果您确定所有三个表中都存在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
语法,这里有一个很棒的visual explanation of joins
答案 1 :(得分:1)
以下查询仅在ID
来自Profile
表的表中至少有一个匹配时选择列: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'
要进一步了解联接,请访问以下链接:
答案 2 :(得分:0)
我已根据您的要求创建了working demo:
下面的查询将从数据库中检索所有匹配的记录。检索配置文件ID,名称stufff和联系表的描述
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