1

結合したい 2 つのテーブルがありますが、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

私は何を間違っていますか?

4

6 に答える 6

9

私はあなたが欲しいと思います

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

booksとテーブルの行を一致させるにshelfは、節にそれぞれの用語を含める必要があります。そうしないと、すべての行が と等しくなるためwhere、 の行に対して無操作チェックを実行するだけです。booksshelfNumshelfNum

JOIN@fixme.myopenid.com が示唆しているように、明示的なルートに進むこともできますが、必須ではありません。

于 2008-11-06T03:00:27.160 に答える
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

(シェルフからすべての行を返します)

于 2008-11-06T03:13:12.470 に答える
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句は行を制限していないため、実際に外積を取得しています。

于 2008-11-06T04:24:13.543 に答える
1

SQL を確認してください。where句はおそらくありませんbooksshelfNum= books.shelfNum

そして、それらすべての一重引用符は何のためですか?

于 2008-11-06T03:02:34.737 に答える
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

暗黙の JOIN 条件が適切に記述されていなかったため、結果は外積になりました。

于 2008-11-06T03:01:05.927 に答える
0

As others have mentioned, the problem you faced was with your ON condition. To specifically answer your question:

In MySQL, if you omit a JOIN, an INNER JOIN/CROSS JOIN is used. For other databases, it is different. For example, PostgreSQL uses a CROSS JOIN, not an INNER JOIN.

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

"In MySQL, JOIN, CROSS JOIN, and INNER JOIN are syntactic equivalents (they can replace each other). In standard SQL, they are not equivalent. INNER JOIN is used with an ON clause, CROSS JOIN is used otherwise."

于 2016-10-06T20:26:12.173 に答える