mysql - 连接三个 MySQL 表,这样我就不会得到重复数据

标签 mysql xml

我有三个 mysql 表 tblOnetblTwotblThree

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 文件,对于这本书,有两个评论,因此 titleauthor 等的数据被拉了两次。我该如何克服这个问题,因为当我尝试从 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/

相关文章:

xml - XPath 查询精确匹配

sql - 用根包裹 XML 值 - sql server

php - 更新现有值并添加新值

php - 使用 PHP 遍历来自 Yandex API 的 XML 响应

java - 将元素添加到文档并使用 XPath 查找

c# - JSON 到 XML 类转换

mysql - 有什么办法可以知道查询发送者的IP吗?

MySQL 使用文件导入命令行创建数据库(如果不存在)

mysql - Wildfly 10.1 MySQL 驱动程序域模式安装

sql - MySQL 存储过程 : variable in WHERE clause?