2013-06-22 177 views
0

我有查询,在某些产品的拉动有很多产品的名单将增长我怎样才能加入这个2个MySQL查询一起

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

但我也有一个包含一个pidrating领域的又一表, pid是产品表的链接。

SELECT AVG(rating) FROM ratings GROUP BY pid 

我怎样才能查询,所以它会拉出如下信息?

​​

回答

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。因为它允许你做不完整的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; 
+0

如果你在我的答案中使用子查询方法,你也可以避免不完整的GROUP BY。我认为它也可能更有效率,因为在加入之前分组意味着来自联结的临时表更小。 – Barmar

1

在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 
+0

问题是关于MySQL,而不是MSSQL。 – Barmar

+0

http://stackoverflow.com/questions/3551312/mysql-nested-query-select-statement 这是另一个在mysql中完成的例子。 都基于SQL,这些常见的概念通常是可以转让的。 – SlitCanvas

+0

概念是一样的。查询可能需要一些调整,但MySQL中也有[子查询](https://dev.mysql.com/doc/refman/5.0/en/subqueries.html) – SpenserJ

0
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 
0

当我使用上面的其他职位,它总是表现出这个错误对我说:

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

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

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 
; 

该查询已经过测试,对我来说工作正常。

相关问题