2014-09-30 69 views
0

我有三個表共享公用列id。 (但還沒有被設置爲foreign key檢索與JOIN共享公共字段的MySQL記錄

+----------------+ +----------------+ +----------------+ 
| Table 1  | | Table 2  | | Table 3  | 
+----+-----+-----+ +----+-----+-----+ +----+-----+-----+ 
| id | x | y | | id | a | b | | id | c | d | 
+----+-----+-----+ +----+-----+-----+ +----+-----+-----+ 
| 1 | 0.0 | 0.0 | | 1 | 2.0 | 6.0 | | 1 | 0.1 | 0.5 | 
+----+-----+-----+ +----+-----+-----+ +----+-----+-----+ 
| 2 | 0.0 | 0.0 | | 2 | 3.0 | 7.0 | | 2 | 0.2 | 0.6 | 
+----+-----+-----+ +----+-----+-----+ +----+-----+-----+ 
| 3 | 1.0 | 1.0 | | 3 | 4.0 | 8.0 | | 3 | 0.3 | 0.7 | 
+----+-----+-----+ +----+-----+-----+ +----+-----+-----+ 
| 4 | 0.0 | 0.0 | | 4 | 5.0 | 9.0 | | 4 | 0.4 | 0.8 | 
+----+-----+-----+ +----+-----+-----+ +----+-----+-----+ 

在這種情況下,我怎麼能得到包含字段id, x, y, a, b, c, d其中x = 0.0 and y = 0.0

我希望得到的結果記錄:

+----+-----+-----+-----+-----+-----+-----+ 
| id | x | y | a | b | c | d | 
+----+-----+-----+-----+-----+-----+-----+ 
| 1 | 0.0 | 0.0 | 2.0 | 6.0 | 0.1 | 0.5 | 
+----+-----+-----+-----+-----+-----+-----+ 
| 2 | 0.0 | 0.0 | 3.0 | 7.0 | 0.2 | 0.6 | 
+----+-----+-----+-----+-----+-----+-----+ 
| 4 | 0.0 | 0.0 | 5.0 | 9.0 | 0.4 | 0.8 | 
+----+-----+-----+-----+-----+-----+-----+ 

我已經以關鍵字join搜索,但作爲新手,我有點困惑。請問這個查詢:

SELECT * FROM Table1 
INNER JOIN Table2 
ON Table1.id = Table2.id 
INNER JOIN Table3 
ON Table1.id = Table3.id 
WHERE x = 0.0 and y = 0.0 

做我想要的東西嗎?我沒有看到一種select * from Table2select * from Table3的東西。

回答

1

您可以使用*,達到您想要的列,如果詞組與USING,而不是ON聯接:

SELECT * 
FROM Table1 INNER JOIN 
    Table2 
    USING (id) INNER JOIN 
    Table3 
    USING (id) 
WHERE x = 0.0 and y = 0.0; 

一個警告是關於使用浮點值。通常這些並不確切。如果你使用小數,你應該沒問題。但數據庫中的0.0可能確實是0.0000000000001,這會導致比較失敗。

0

你可以做

SELECT Table1.*, Table2.*, Table3.* FROM Table1 
INNER JOIN Table2 
ON Table1.id = Table2.id 
INNER JOIN Table3 
ON Table1.id = Table3.id 
WHERE x = 0.0 and y = 0.0 

,但你會得到的id列3倍於你的結果。

爲了讓您確切的結果,你需要明確地選擇你需要的列:

SELECT Table1.id, Table1.x, Table1.y, 
     Table2.a, Table2.b, 
     Table3.c, Table3.d 
FROM Table1 
INNER JOIN Table2 
ON Table1.id = Table2.id 
INNER JOIN Table3 
ON Table1.id = Table3.id 
WHERE x = 0.0 and y = 0.0 
0

是的,您的查詢返回您指定的結果集,除了返回一些額外的列。

下面是我將如何編寫該查詢的示例。

SELECT t.id 
    , t.x 
    , t.y 
    , u.a 
    , u.b 
    , v.c 
    , v.d 
    FROM Table1 t 
    JOIN Table2 u ON u.id = t.id 
    JOIN Table3 w ON w.id = t.id 
WHERE t.x = 0.0 
    AND t.y = 0.0 

一些注意事項:

如果沒有「匹配」值Table2Table3 ID,則沒有行會返回該idTable1

在MySQL中,沒有必要包含INNER關鍵字,省略對語句的執行方式沒有影響。

當查詢引用多個表時,最好限定所有列引用,而不僅僅是那些列名稱衝突的列引用。 (當某人在表3中添加一個名爲x的列時,您的查詢將停止工作,並將開始拋出「模棱兩可的列」錯誤。)

我更喜歡爲每個表分配一個簡短別名,並使用別名。