【问题标题】:How to select from / join 5 tables using PHP and mySQL如何使用 PHP 和 mySQL 从/连接 5 个表中进行选择
【发布时间】:2013-09-20 02:15:02
【问题描述】:

我正在尝试根据 5 个表中的字段构建评论记录:

我已经标记了我需要的所有列,但目前我只是检索所有 user_rating 表。

这是我目前所拥有的:

SELECT DISTINCT user_rating.*, whiskey.name, user_notes.overall, users.image, user_rate.rate_number
    FROM user_rating
    LEFT JOIN whiskey ON whiskey.id = user_rating.whiskeyid
    LEFT JOIN users ON users.username = user_rating.username
    LEFT JOIN user_notes ON user_notes.username = user_rating.username AND user_rating.whiskeyid = user_notes.whiskey_id
    LEFT JOIN user_rate ON user_rate.whiskey_id = user_rating.whiskeyid AND user_rate.username = user_rating.username
    ORDER BY user_rating.id DESC

起初我认为这给了我想要的结果,但后来我注意到我得到了多行以及太多的空字段。任何帮助将不胜感激。

编辑:

多行是指重复的行。另外,我知道左连接会在连接的右侧产生空值。我的意思是我得到的空值比我应该得到的更多,因为数据在数据库中。

为了澄清,我正在尝试创建一个最近的评论列表,其中最近的评论排在最前面。每条评论由一个用户名、11 个类别(每个都是整数值)、总体评分(int 值)、注释(字符串)、图像(URL)和威士忌名称(字符串)组成。

【问题讨论】:

  • 左连接说“给我左边的所有记录,即使我要加入的表上没有匹配的记录”。左右连接的最终结果通常是对应表的 NULL 字段。如果您只想要连接条件为真的情况,请将“LEFT”更改为“INNER”。
  • 您能否提供一些示例数据和您所做想要的示例?
  • @ChrisRasco 我明白了,请看我编辑的帖子。
  • @GordonLinoff 我发布的图片显示了我正在查询的表的结构。我编辑了我的帖子以澄清我在结果中需要什么。我会将一些示例数据放在一起以进一步澄清。
  • @Bishop 你能发布一些你得到的重复记录吗?根据查询,我不确定您为什么会得到它们,并且根据结构和您的查询,它并不是立即显而易见的。

标签: php mysql join distinct


【解决方案1】:

事实证明,我的查询没有任何问题。我正在使用其数据库的人没有维护它,因此对同一产品和用户有多个评论,只有总体评分不同。此外,还有许多关于甚至不存在的产品的评论。我应该从一开始就更仔细地查看数据库,因为删除所有错误的行解决了我的问题。感谢您的所有意见。

【讨论】:

    【解决方案2】:

    1) 由于您使用 DISTINCT,因此您无法获得多个 SAME 行。 (多个是指重复吗?)

    2)您得到空字段,因为您使用的是 LEFT JOIN 并且您的表无法连接(某些“ON 子句”无法评估为真)

    【讨论】:

    • 1) 这就是我理解的 DISTINCT 子句要完成的任务,但是是的,我的意思是重复的行。 2) 我知道左连接本质上会创建空字段,但是我的查询给出的结果包含太多基于数据库中数据的空条目。
    • 听起来很奇怪。这不应该发生。你能提供一些数据吗?也许使用 sqlfiddle 之类的东西?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    相关资源
    最近更新 更多