2008-11-06 74 views
1

我有,我想加入兩個表,但我從MySQL查詢:跨產品,而不是加入

得到一個錯誤
Table: books 
bookTagNum ShelfTagNum 
book1  1 
book2  2 
book3  2 

Table: shelf 
shelfNum shelfTagNum 
1   shelf1 
2   shelf2 

我想我的結果是:

bookTagNum ShelfTagNum shelfNum 
book1  shelf1   1 
book2  shelf2   2 
book3  shelf2   2 

但反而,我也越來越額外的結果:

book1  shelf2   2 

我覺得我的查詢是做,而不是加入跨產品:

SELECT `books`.`bookTagNum` , `books`.`shelfNum` , `shelf`.`shelfTagNum` , `books`.`title` 
FROM books, shelf 
where `books`.`shelfNum`=`books`.`shelfNum` 
ORDER BY `shelf`.`shelfTagNum` ASC 
LIMIT 0 , 30 

我在做什麼錯?

+0

注意:我試着盡我所能來回答,但是您的問題有點令人困惑,因爲您的示例沒有顯示books.shelfNum或books.title列,即使您在查詢中引用它們。即使您請求4,您的輸出也有3列。 – 2008-11-06 12:04:46

+0

IMplicit連接是一種非常糟糕的編程習慣。他們受到偶然的交叉連接並且更難以維護(例如,是故意交叉連接還是錯誤?)自1992年以來,它們已經過時,並且沒有任何藉口可以使用一個更好,更簡化,缺少開放的錯誤選項可用。 – HLGEM 2010-12-20 17:14:56

回答

8

我想你想

where `books`.`shelfTagNum`=`shelf`.`shelfNum` 

爲了從booksshelf表,你需要得到各方面在where子句匹配的行 - 否則,你只是執行無操作請檢查books的行,因爲每行的shelfNum將等於其shelfNum

由於@ fixme.myopenid.com建議,您也可以去明確的JOIN路線,但沒有必要。

+0

我認爲他想要books.shelfNum = shelf.shelfTagNum – 2008-11-06 03:02:17

0

試試這個:

SELECT `books`.`bookTagNum` , `books`.`shelfNum` , `shelf`.`shelfTagNum` , 
    `books`.`title` 
FROM books, shelf 
where `books`.`shelftagNum`=`shelf`.`shelfNum` 
ORDER BY `shelf`.`shelfTagNum` ASC 
LIMIT 0 , 30 

因爲隱式連接條件是不正確陳述的結果是積。

1

檢查你的SQL。你的where子句不可能是booksshelfNum = booksshelfNum

這些單引號是什麼?

+0

反引號是mysql的關鍵字引用格式... – Stobor 2009-05-21 00:20:08

5

如果你想確保你正在做一個連接,而不是一個跨產品,你應該明確說明它在SQL中,這樣的:

SELECT books.bookTagNum,books.shelfNum, shelf.shelfTagNum, books.title 
FROM books INNER JOIN shelf ON books.shelfNum = shelf.shelfTagNum 
ORDER BY shelf.shelfTagNum 

(這將返回只有那些存在於行兩個表),或:

SELECT books.bookTagNum,books.shelfNum, shelf.shelfTagNum, books.title 
FROM books LEFT OUTER JOIN shelf ON books.shelfNum = shelf.shelfTagNum 
ORDER BY shelf.shelfTagNum 

(這將返回從書本中的所有行),或:

SELECT books.bookTagNum,books.shelfNum, shelf.shelfTagNum, books.title 
FROM books RIGHT OUTER JOIN shelf ON books.shelfNum = shelf.shelfTagNum 
ORDER BY shelf.shelfTagNum 

(其中WIL l返回貨架上的所有行)

4

供參考:如果你重寫你的名字是一致的,事情會變得更容易閱讀。

Table 1: Book 
BookID  ShelfID BookName 
1   1  book1 
2   2  book2 
3   2  book3 

Table 2: Shelf 
ShelfID ShelfName 
1   shelf1 
2   shelf2 

現在,查詢,提取書書架是

SELECT 
b.BookName, 
s.ShelfName 
FROM 
Book b 
JOIN Shelf s ON s.ShelfID = b.ShelfID 

要回答原來的問題:

> where `books`.`shelfNum`=`books`.`shelfNum` 
>  ^^^^^--------------^^^^^------------- books repeated - this is an error 

WHERE條款,如寫的,什麼都不做,並且因爲where子句不限制任何行,所以確實獲得了交叉產品。

0

正如其他人所說,你面臨的問題是你的條件。具體回答你的問題:

在MySQL中,如果你省略了一個JOIN,就使用INNER JOIN/CROSS JOIN。對於其他數據庫,它是不同的。例如,PostgreSQL使用CROSS JOIN,而不是INNER JOIN。

重新:http://dev.mysql.com/doc/refman/5.7/en/join.html

「在MySQL,JOIN,CROSS JOIN和INNER JOIN是句法當量(它們可以彼此替換)。在標準的SQL,它們是不等效的INNER JOIN使用具有ON。子句,否則使用CROSS JOIN。「