我有三个 mysql 表 tblOne
、tblTwo
和 tblThree
SELECT tblOne.bookID AS bookID,
tblOne.title AS title,
tblOne.author AS author,
tblOne.blurb AS blurb,
tblOne.isbn AS isbn,
tblOne.coverImage As coverImage,
CONCAT_WS(" ", tblThree.firstName, tblThree.lastName) AS fullName,
tblTwo.rating,
tblTwo.reviewText AS review,
CONCAT_WS(" ", tblTwo.reviewDate, tblTwo.reviewTime) AS reviewDate
FROM tblTwo
INNER JOIN tblOne
ON tblTwo.bookID = tblOne.bookID
INNER JOIN tblThree
ON tblTwo.userID = tblThree.userID
WHERE tblTwo.bookID = 1000102;
输出填充一个 XML 文件,对于这本书,有两个评论,因此 title
、author
等的数据被拉了两次。我该如何克服这个问题,因为当我尝试从 JavaScript
查询中访问标签时,它失败了,因为它说它是未定义的。我认为这是因为有不止一个结果。
上面的 SQL 实际上确实有效,我的 PHP 是错误的,但是......
如何在没有review
的情况下返回图书详情?目前,只有经过审核的图书才会返回其详细信息。
最佳答案
您正在使用 INNER JOIN,这需要行存在于联接表中。请改用 LEFT JOIN,即使左连接表中的行不存在,它也会从第一个列出的表中返回行:
SELECT tblBooks.bookID AS bookID,
tblBooks.title AS title,
tblBooks.author AS author,
tblBooks.blurb AS blurb,
tblBooks.isbn AS isbn,
tblBooks.coverImage As coverImage,
CONCAT_WS(' ', tblMembers.firstName, tblMembers.lastName) AS fullName,
IFNULL(tblReviews.rating, '0'),
tblReviews.reviewText AS review,
CONCAT_WS(' ', tblReviews.reviewDate, tblReviews.reviewTime) AS reviewDate
FROM tblBooks
LEFT JOIN tblReviews
ON tblReviews.bookID = tblBooks.bookID
LEFT JOIN tblMembers
ON tblReviews.userID = tblMembers.userID
GROUP BY 1, 2, 3, 4, 5, 7, 8;
请注意,我在 FROM 子句中列出了 tblOne
first,这是获取所有书籍所必需的,即使有些书籍没有评论。
当没有评论时,您将不得不处理 null
值。考虑使用 IFNULL()
生成空白或默认值,例如
IFNULL(tblTwo.rating, '') -- instead of just tblTwo.rating
或者
IFNULL(tblTwo.reviewText, 'None') -- instead of just tblTwo.reviewText
等等
关于mysql - 连接三个 MySQL 表,这样我就不会得到重复数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16308856/