具有多个select语句的复杂MySQL查询

时间:2013-03-01 15:18:41

标签: mysql select multi-table

我在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分组到一个查询中?

3 个答案:

答案 0 :(得分:5)

您应该JOIN profile.id上的表格和其他表格中的profileid

如果您确定所有三个表中都存在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语法,这里有一个很棒的visual explanation of joins

答案 1 :(得分:1)

以下查询仅在ID来自Profile表的表中至少有一个匹配时选择列: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'

要进一步了解联接,请访问以下链接:

答案 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