包含多个select语句的复杂MySQL查询



我在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.idprofileidJOIN表。

如果您确定profileid在所有三个表中都存在,那么您可以使用INNER JOININNER 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表中的IDContactAddress表上至少有一个匹配时才选择列。如果它们中的一个或两个都是可空的,则使用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

相关内容

  • 没有找到相关文章