【问题标题】:Pull multiple rows from one table but only one row from a related table从一个表中提取多行,但从相关表中仅提取一行
【发布时间】:2018-06-16 20:57:57
【问题描述】:

我目前正在尝试连接两个表,但要防止其中一个表的信息重复。

用户的表有 4 列,uid、name、email 和 status。 stats表有4列,uid、date、follows、views

我希望能够从 stats 表中提取每条记录,并且只从 user 表中提取名称、电子邮件和状态值。我对以下 SQL 的问题是它复制了用户表中的数据,有没有办法解决这个问题?

SELECT u.name
     , u.email
     , u.status
     , s.date
     , s.follows
     , s.views 
  FROM users u
  JOIN stats s 
    ON u.id = s.uid 
 WHERE name = :name

【问题讨论】:

  • 如果 stats 表中每个用户有多个记录,那么恐怕 sql 会将用户表中的详细信息连接到每条记录,除此之外您无能为力分别查询这两个表。
  • 似乎上面和下面都涵盖了这一点,但如需进一步帮助,请参阅meta.stackoverflow.com/questions/333952/…

标签: mysql pdo


【解决方案1】:

如果您不希望每个匹配的统计数据行都伴随着匹配的用户行,那么您必须运行两个查询:

SELECT u.id, u.name, u.email, u.status FROM users u WHERE name = :name

注意u.id 的结果,因为您将使用它作为第二个查询的参数:

SELECT s.date, s.follows, s.views FROM stats s WHERE s.uid = :uid

您必须了解关系模型是有效的因为每个查询结果本身就是一个关系。匹配的数据在每一行中返回,这使得JOIN 成为代数的一部分,其中结果可以用作另一个JOINGROUP BY 或其他一些关系运算的操作数.

您应该阅读 C.J. Date 的 SQL and Relational Theory: How to Write Accurate SQL Code

【讨论】:

    猜你喜欢
    • 2017-02-01
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    相关资源
    最近更新 更多