mysql左连接问题

时间:2011-08-30 17:57:45

标签: mysql sql join

我想让make查询从表'a'中选择所有名称,其中表'b'我有id_one ='3'。 id_two是表中的id记录 'a',两个记录与id_one ='3'有关系。我如何进行查询?

CREATE TABLE IF NOT EXISTS `a` (
  `id` int(11) NOT NULL,
  `name` varchar(11) NOT NULL,
  `value` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Zrzut danych tabeli `a`
--

INSERT INTO `a` (`id`, `name`, `value`) VALUES
(1, 'lalala', 0),
(2, 'allalala', 0);






CREATE TABLE IF NOT EXISTS `b` (
  `id_one` int(11) NOT NULL,
  `id_two` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Zrzut danych tabeli `b`
--

INSERT INTO `b` (`id_one`, `id_two`) VALUES
(3, 1),
(3, 2);

4 个答案:

答案 0 :(得分:3)

这就是你想要的:

select Name
from a inner join b on a.id = b.id_two
where b.id_one = 3

答案 1 :(得分:0)

抱歉,我不完全理解你的模式或问题,但我认为你要求的是:

SELECT * FROM a 
JOIN b on a.id = b.id_two;

试试。

答案 2 :(得分:0)

您的问题标题提到左连接,但您不需要左连接来进行您描述的查询。

左连接有助于找到与您期望的方式不匹配的内容。因此,在这种情况下使用左连接取决于您要查找的内容。如果您正在寻找没有相应表格的b.id_two条目,

select Name, b.* from b left join a on a.id = b.id_two 

这将为您提供一个表,其中列出了表b中的每一行,其中NULL代替了表a中没有匹配项的名称。

同样,如果您要查找b.id_two中没有条目的名称,您可以使用

select Name, b.* from a left join b on a.id = b.id_two 

如果要强制始终存在对应关系,则可以在父表和子表之间定义外键约束。

答案 3 :(得分:0)

select Name
from a join b on a.id = b.id_two
where b.id_one = 3;

也会努力得到你的答案。我可能还建议你显着改进你的create table语句以包括索引。 E.G。

CREATE TABLE IF NOT EXISTS `a` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT,
 `name` varchar(11) NOT NULL,
 `value` int(11) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `b` (
  `id_one` bigint(20) NOT NULL,
  `id_two` bigint(20) NOT NULL,
  KEY `FKCAFBB09382DEAC` (`id_one`),
  CONSTRAINT `b_a_1` FOREIGN KEY (`id_two`) REFERENCES `a` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

我也会使用bigint作为主键并使用charset = utf8
现在,将应用程序迁移到多语言只是常见的,现在就开始奠定基础。 IMHO