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

我究竟做错了什么?

4

6 回答 6

9

我想你想要

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

为了匹配booksshelf表中的行,您需要在where子句中包含每个中的术语 - 否则,您只是对 的行执行无操作检查books,因为每一行都shelfNum将等于它的shelfNum.

正如@fixme.myopenid.com 建议的那样,您也可以走明确的JOIN路线,但这不是必需的。

于 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= booksshelfNum

这些单引号是干什么用的?

于 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

正如其他人所提到的,您面临的问题是您的 ON 条件。具体回答您的问题:

在 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。”

于 2016-10-06T20:26:12.173 回答