2013-03-01 52 views
1

我在MySQL三个表是链接在一起:复杂的MySQL查询与多个SELECT语句

档案(ID,姓名,东西..)

联系(ID,简档,递减,ORD)

地址(ID,简档,递减,ORD)

现在我需要选择配置文件选项卡中的所有个人资料le,其中Ord = 1的Contact和Address中的“desc”字段。(这是用于搜索功能,在表格中我将显示客户端的名称,主要联系信息和主要地址。

我目前可以用三个独立的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组合成一个查询?

回答

5

您应该能够JOINprofile.idprofileid在其他表中的表。

如果您确定所有三个表中都存在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

+0

太谢谢你了! 1为解释和第二为链接,您的信息和JW信息帮助我更好地理解SQL ...(我喜欢理解和学习的答案,不只是复制粘贴!!!! – 2013-03-02 00:21:30

+0

@Daniel不客气,我总是乐意提供帮助!:) – Taryn 2013-03-02 00:32:08

1

下面的这个查询只在IDProfile表至少有一个匹配表上时选择列:ContactAddress。如果一个或两个都是可空,使用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' 

为了进一步获得更多的知识有关加入,请访问以下链接:

+0

HI JW,你可以看看为bluefeet留下的评论,谢谢你也应用于你! – 2013-03-02 00:22:15

0

我创建working demo为你的要求:

查询波纹管将检索从database.its所有匹配的记录检索配置文件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