【问题标题】:Problem with SQL statement in MySQLMySQL中SQL语句的问题
【发布时间】:2011-09-12 18:36:08
【问题描述】:

我正在运行一条 SQL 语句:

$sql = "SELECT pic, userid 
        FROM user_details 
          INNER JOIN wp_users ON user_details.userid  
        WHERE wp_users.id = user_details.userid 
        LIMIT $recordstart, $pagesize
       ";

查询旨在从 user_details 和 wp_users 中选择记录,但应仅在匹配时选择 (wp_users.id = user_details.userid)。

目标是它基本上从一个表中选择,同时从另一个表中检索记录(基于 id 匹配)

问题是它显示重复记录。我该如何解决这个问题?

【问题讨论】:

  • 请问什么 DBMS? MySQL?
  • 首先,你知道你的查询是错误的吗?那不可能是你正在运行的那个。另外,当一个用户有多个 user_details 行时,你想做什么?随便挑一个?或者你不会从细节中得到任何东西,只是确保有细节?或者您是否需要在一行 (PIVOT) 中获取来自多个详细信息的所有数据?

标签: php mysql sql select join


【解决方案1】:
SELECT DISTINCT pic, userid 
FROM user_details 
  INNER JOIN wp_users ON wp_users.id=user_details.userid 
LIMIT $recordstart, $pagesize

【讨论】:

  • 问题说他得到了重复的行。也许你可以在你的回答中解决这个问题。
  • 我现在已经用 DISTINCT 解决了这个问题。
  • 我没有回答,因为答案过多,而且提问者没有具体说明他想如何处理多个子行。另外,我不是 MySQL 专家。但是最好解决发帖者的整个问题,而不是仅仅发布他的查询的语法更正。
  • 由于缺少连接标准,我的印象是他最终得到了他的结果集的笛卡尔积(在 user_details 表中的所有行中)。所以修复 SQL 确实是解决方案。我可能错了,但我试图回答这个问题。
【解决方案2】:

您应该将您的 JOIN 条件放在 ON 之后。像这样:

$sql="select pic, userid 
      from user_details 
      inner join wp_users on (wp_users.id=user_details.userid)
      limit $recordstart, $pagesize";

但真正的问题是,user_details 中的每个对应记录都有超过 1 条记录wp_users(反之亦然)。 INNER JOIN 导致数据库生成 Cartesian productuser_detailswp_users 记录。然后根据您当前的 WHERE 条件(wp_users.id=user_details.userid)过滤结果表。根据您的需要,如果您只想检索唯一记录,您可以使用 GROUP BY 或 DISTINCT。 例如,如果您需要 userid 是唯一的:

$sql="select pic, userid 
      from user_details 
      inner join wp_users on (wp_users.id=user_details.userid)
      group by userid
      limit $recordstart, $pagesize";

【讨论】:

  • MySQL 不支持某种半连接(EXISTS)吗?使用它似乎比 GROUP BY 更正确。
  • @Erik 是的,mysql 中有 EXISTS。但这实际上取决于 OP 试图通过查询实现什么。问题是:如果单个 wp_users 有 2 个 user_details 会返回什么?
  • 鉴于他没有从该表中选择任何列并说“只有在匹配时”,这对我来说听起来确实像是半联接!好吧,等等……他确实说过“检索记录”,所以也许他确实需要第二张桌子上的东西。你是对的。
  • MySQL 是 唯一 主要数据库,它接受在 GROUP BY 查询中未聚合 pic 列。我发现这会导致难以发现的错误。最好说MAX(pic)MIN(pic),这样每个用户ID 的选择就不是任意的了。
【解决方案3】:

使用DISTINCT 仅返回唯一行并在ON 部分完成您的连接条件:

$sql="select distinct pic, userid
      from user_details
      inner join wp_users on wp_users.id=user_details.userid
      limit $recordstart, $pagesize"; 

【讨论】:

  • MySQL 不支持某种半连接(EXISTS)吗?使用它似乎比 GROUP BYDISTINCT 更正确。
【解决方案4】:

我可以试试

 $sql = "select pic, userid 
 from user_details 
 inner join wp_users on user_details.userid = wp_users.id
 limit $recordstart, $pagesize";

【讨论】:

  • 问题说他得到了重复的行。也许你可以在你的回答中解决这个问题。
【解决方案5】:

您不小心漏掉了 ON 的 = 部分。

$sql="select pic, userid 
      from user_details 
        inner join wp_users on user_details.userid
        = wp_users.id  
      where wp_users.id=user_details.userid   
  limit $recordstart, $pagesize";

【讨论】:

  • 问题说他得到了重复的行,你没有回答。您是否注意到 WHERE 子句与 ON 相同?
【解决方案6】:

使用 GROUP BY ,因为如果第二个表中有多个记录,每一个记录在第一个表中,它会显示重复记录

【讨论】:

  • MySQL 不支持某种半连接(EXISTS)吗?使用它似乎比GROUP BY 更正确。
  • 实际上没有(只有 EXISTS 或 IN ... ,但它不是 join ),因为在其中 JOIN 结合了记录(例如,如果你有 m:n 约束,它将返回任何可用的组合)
  • 将 EXISTS 与外部引用一起使用是一种连接。它被称为半连接或反半连接。
猜你喜欢
  • 2011-10-17
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
相关资源
最近更新 更多