Mysql查询两个表与引用表连接

Mysql查询两个表与引用表连接,mysql,sql,join,correlated-subquery,Mysql,Sql,Join,Correlated Subquery,嗨,我有两张这样的桌子: 表1: name | distro1 | distro2 | distro3 ---------------------------------- foo | 001 | 002 | 003 表2: id | distro --------------- 001 | slackware 002 | redhat 003 | debian 我希望得到如下选择结果= name | dis1 | dis2 | dis3 --------

嗨,我有两张这样的桌子:

表1:

name | distro1 | distro2 | distro3
----------------------------------
foo  | 001     | 002     | 003
表2:

id  | distro 
---------------
001 | slackware
002 | redhat
003 | debian
我希望得到如下选择结果=

name | dis1      | dis2   | dis3
----------------------------------
foo  | slackware | redhat | debian
创建这些源表所需的查询

CREATE TABLE IF NOT EXISTS `table1` (
  `name` varchar(30) NOT NULL,
  `distro1` varchar(30) NOT NULL,
  `distro2` varchar(30) NOT NULL,
  `distro3` varchar(30) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `table1` (`name`, `distro1`, `distro2`, `distro3`) VALUES
('foo', '001', '002', '003');

CREATE TABLE IF NOT EXISTS `table2` (
  `id` varchar(30) NOT NULL,
  `distro` varchar(30) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `table2` (`id`, `distro`) VALUES
('001', 'slackware'),
('002', 'readhat'),
('003', 'debian');

你可以有这样的东西:

通过使用
内部联接
,假定所有发行版都有值,并且在
表2中有相应的匹配项

SELECT  a.Name, 
        b.distro Distro1, 
        c.distro Distro2, 
        d.distro Distro3
FROM    myTableA a
            INNER JOIN myTableB b
                on a.distro1 = b.id
            INNER JOIN myTableB c
                on a.distro2 = c.id
            INNER JOIN myTableB d
                on a.distro3 = d.id
更新1

SELECT  a.Name, 
        b.distro Distro1, 
        c.distro Distro2, 
        d.distro Distro3
FROM    myTableA a
            LEFT JOIN myTableB b
                on a.distro1 = b.id
            LEFT JOIN myTableB c
                on a.distro2 = c.id
            LEFT JOIN myTableB d
                on a.distro3 = d.id

你可以有这样的东西:

通过使用
内部联接
,假定所有发行版都有值,并且在
表2中有相应的匹配项

SELECT  a.Name, 
        b.distro Distro1, 
        c.distro Distro2, 
        d.distro Distro3
FROM    myTableA a
            INNER JOIN myTableB b
                on a.distro1 = b.id
            INNER JOIN myTableB c
                on a.distro2 = c.id
            INNER JOIN myTableB d
                on a.distro3 = d.id
更新1

SELECT  a.Name, 
        b.distro Distro1, 
        c.distro Distro2, 
        d.distro Distro3
FROM    myTableA a
            LEFT JOIN myTableB b
                on a.distro1 = b.id
            LEFT JOIN myTableB c
                on a.distro2 = c.id
            LEFT JOIN myTableB d
                on a.distro3 = d.id

你可能想加入左键。不清楚是否每一行都有一个匹配的行用于每个发行版。我假设每个发行版都有一个对应的匹配到另一个表。但我仍将编辑我的答案。您可能希望左键加入。不清楚是否每一行都有一个匹配的行用于每个发行版。我假设每个发行版都有一个对应的匹配到另一个表。但我仍将编辑我的答案。请参阅规范化。如果有第四个发行版规范化,会发生什么。如果有第四个发行版会发生什么