2011-08-30 116 views
1

我想讓查詢選擇表'a'中的所有名稱,從表'b'我有id_one ='3'。 id_two是來自表 'a'的id記錄,兩條記錄與id_one ='3'有關係。我如何查詢?mysql左連接問題

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); 

回答

3

這是你想要什麼:

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

只是好奇,這是如何返回值,但我的建議是空的? :) – ajacian81

0

對不起,我沒有完全理解你的架構或你的問題,但我認爲你想要求的是什麼:

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

嘗試。

+0

工作,但數組是空的 – xyz

0

你的問題標題中提到左加入,但你並不需要一個左連接,使您所描述的查詢。

左連接非常適合尋找與預期不符的事物。所以,在這種情況下使用左連接取決於你在找什麼。如果您在地方表的名字尋找b.id_two條目沒有相應的表項,

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

這會給你列出表B中的每一行的表,如果爲空沒有匹配的地方。

同樣,如果你正在尋找沒有在b.id_two條目名稱,你可以使用

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

如果要強制執行總有一個對應關係,就可以定義外父表和子表之間的關鍵約束。

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

也將工作得到您的答案。我也建議你大大改進你的創建表語句以包含索引。例如。

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
這些天它只是常見的要遷移應用程序以多語種,現在躺在地上的工作。恕我直言

+0

所有這些都不錯,但對於顯然只是學習如何使用查詢和連接的人而言,這非常複雜。 – Poodlehat