【问题标题】:How can i join this 2 MySQL queries together我如何将这 2 个 MySQL 查询连接在一起
【发布时间】:2013-06-22 17:07:54
【问题描述】:

我有一个查询,其中包含一些产品,有很多产品并且列表会增长

SELECT pid, link, created_at FROM products ORDER BY timestamp DESC

但我还有另一个表,其中包含 pidrating 字段,pid 是产品表的链接。

SELECT AVG(rating) FROM ratings GROUP BY pid

我如何查询才能提取出如下信息?

products.pid, products.link, products.created_at, AVG(ratings.rating)

【问题讨论】:

    标签: php mysql sql subquery


    【解决方案1】:

    在 MySQL 中,这应该会给出你想要的结果;

    SELECT p.pid, p.link, p.created_at, AVG(r.rating) rating
    FROM products p
    LEFT JOIN ratings r
      ON p.pid=r.pid
    GROUP BY p.pid;
    

    An SQLfiddle to test with.

    附带说明,MySQL 很特别,因为它允许您执行不完整的GROUP BY 查询,因此如果您想在另一个数据库上运行它(或者可能出于文体原因),查询应该改为;

    SELECT p.pid, p.link, p.created_at, AVG(r.rating) rating
    FROM products p
    LEFT JOIN ratings r
      ON p.pid=r.pid
    GROUP BY p.pid, p.link, p.created_at;
    

    【讨论】:

    • 如果您在我的回答中使用子查询方法,您也可以避免不完整的GROUP BY。我认为它也可能更有效,因为在加入之前进行分组意味着加入的临时表更小。
    【解决方案2】:

    在 MS-SQL 中,可以选择如下:

    SELECT p.pid, 
           p.link, 
           p.created_at, 
           (SELECT AVG(rating) FROM ratings r where r.pid = p.pid) as rating
      FROM products p
     ORDER BY timestamp DESC
    

    【讨论】:

    • 问题是关于 MySQL,而不是 MSSQL。
    • stackoverflow.com/questions/3551312/… 这是另一个在 mysql 中完成的示例。两者都是基于 SQL 的,这样的常见概念通常是可以转移的。
    • 概念是一样的。查询可能需要一些调整,但sub-queries 也存在于 MySQL 中
    • 概念通常相同,但细节可能不同。不知道如何编写简单联接的人可能无法进行转换。此外,性能问题各不相同,因此首选方法非常依赖于数据库。
    • 我同意每个 SQL 数据库系统都有不同的标准实现。但在这种情况下,解决方案确实有效。更好的解决方案是上面那个使用内部连接而不是子选择的解决方案。
    【解决方案3】:
    SELECT p.pid, link, created_at, avg_rating
    FROM products p
    JOIN (SELECT pid, AVG(rating) avg_rating
          FROM ratings
          GROUP BY pid) a
    ON p.pid = a.pid
    ORDER BY timestamp DESC
    

    【讨论】:

      【解决方案4】:

      当我使用上面的其他帖子时,它总是向我显示这个错误:

      'Unknown column "timestamp" in "order clause"'
      

      我相信时间戳已添加到 products 表中的 created_at 列中。所以,我已经使用了这个列本身的排序。它将从产品表中选择最后一行并用它打印 AVG(rating)。

      SELECT products.pid, products.link, products.created_at, AVG(ratings.rating)
      FROM products, ratings
      WHERE products.pid = ratings.pid
      GROUP BY products.pid
      ORDER BY products.created_at ASC
      ; 
      

      这个查询已经过测试,对我来说可以正常工作。

      【讨论】:

        猜你喜欢
        • 2017-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-24
        • 2019-04-04
        • 2017-01-12
        • 2014-07-27
        • 1970-01-01
        相关资源
        最近更新 更多