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

时间:2012-08-05 07:24:46

标签: 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
----------------------------------
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');

1 个答案:

答案 0 :(得分:1)

你可以这样:

使用INNeR JOIN,假设所有发行版都有值且在table 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