2013-01-24 55 views
0

我有3個mysql表顯示如下。在這種情況下,tbl_a是與tbl_btbl_c相關的連接表。我想非規範化tbl_amysql反規範化連接表

tbl_a模式

b_id, c_id, id, x,y,z 

tbl_b模式

id, a, b, c 

tbl_c模式

id, d, e, f 

的想法是,在tbl_a每個id,我想替換b_idc_id與他們各自的表中的完整條目。

我有查詢

select a,b,c,d,e,f,x,y,z from tbl_a 
INNER JOIN tbl_b on tbl_a.b_id = tbl_b.id 
INNER JOIN tbl_c on tbl_a.c_id = tbl_c.id; 

但是這將導致2行中tbl_a每個id

有人可以解釋爲什麼這不起作用嗎?

回答

1

任何機會在tbl_a有重複的ID?

查詢正確 - 檢查http://sqlfiddle.com/#!8/9c666/1

CREATE TABLE `tbl_a` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `b_id` int(11) NOT NULL, 
    `c_id` int(11) NOT NULL, 
    `xyz` varchar(30) NOT NULL, 
    PRIMARY KEY (`id`) 
) ; 

CREATE TABLE `tbl_b` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `abc` varchar(30) NOT NULL, 
    PRIMARY KEY (`id`) 
) ; 

CREATE TABLE `tbl_c` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `def` varchar(30) NOT NULL, 
    PRIMARY KEY (`id`) 
) ; 


INSERT INTO `tbl_b` (`id`, `abc`) VALUES 
(1, 'b1'), 
(2, 'b2'), 
(3, 'b3'), 
(4, 'b4'); 


INSERT INTO `tbl_c` (`id`, `def`) VALUES 
(1, 'c1'), 
(2, 'c2'), 
(3, 'c3'); 


INSERT INTO `tbl_a` (`b_id`, `c_id`, `xyz`) 
SELECT (ABS(CRC32(UUID())) % 4) + 1, (ABS(CRC32(UUID())) % 3) + 1, SUBSTRING(UUID(), 3, 5); 

SELECT * FROM tbl_a; 

SELECT * FROM tbl_a 
INNER JOIN tbl_b on tbl_a.b_id = tbl_b.id 
INNER JOIN tbl_c on tbl_a.c_id = tbl_c.id; 
+0

我會仔細檢查我的數據,但我不這麼認爲... –

+0

原來是一個數據錯誤。謝謝。 –

0

這可能不是你想要什麼,但話又說回來,你還沒有告訴我們你想要什麼......

SELECT a,b,c,d,e,f,x,y,z 
    FROM tbl_a 
    LEFT 
    JOIN tbl_b 
    ON tbl_a.b_id = tbl_b.id 
    LEFT 
    JOIN tbl_c 
    ON tbl_a.c_id = tbl_c.id;