2015-11-18 76 views
2

我想用下面的表格在线想出一个做法页面上这样一个问题:MySQL的嵌套选择

问题: 对于所有案件中,额定同一客户同一产品 不止一次,并在某些时间点给它比以前更低的评分 ,返回客户名称,产品名称, 和给出的最低星级评分。

我似乎无法弄清楚为什么这是不正确的 - 任何人都可以提供帮助吗?

+0

您需要连接条件(切换到现代显式连接语法。)还需要GROUP BY。 – jarlh

+0

您可以添加示例数据吗?我正在为你做点什么。 –

回答

1

这里是我到目前为止(无样本数据):

SELECT 
    Customer.customer_name, 
    Product.product_name, 
    MIN(Rating.rating_stars) 
FROM Rating 
JOIN Product ON Rating.prod_id = Product.prod_id 
JOIN Customer ON Rating.cust_id = Customer.prod_id 
GROUP BY Customer.customer_name, Product.product_name 
HAVING COUNT(Product.prod_id) > 1 
+0

太棒了!在第七行,这应该是Rating.cust_id = Customer.cust_id not prod_id – RandomMath

+0

你在哪里检查评级应该在未来?你甚至不检查评级应该不同。 – Adish

+0

很高兴这得到你在找什么。 –

1

这个查询将返回已经由同一客户审查一次以上产品的最低评级星星,与任何较新的收视率比旧的等级较低:

SELECT 
    r1.prod_id, 
    r1.cust_id, 
    MIN(r1.rating_star) AS min_rating 
FROM 
    rating r1 INNER JOIN rating r2 
    ON r1.prod_id=r2.prod_id 
    AND r1.cust_id=r2.cust_id 
    AND r1.rating_date>r2.rating_date 
    AND r1.rating_star<r2.rating_star 
GROUP BY 
    r1.prod_id, 
    r1.cust_id 

你就可以加入这个查询的产品和客户表:

SELECT 
    customer.customer_name, 
    product.product_name, 
    m.min_rating 
FROM (
    SELECT 
    r1.prod_id, 
    r1.cust_id, 
    MIN(r1.rating_star) AS min_rating 
    FROM 
    rating r1 INNER JOIN rating r2 
    ON r1.prod_id=r2.prod_id 
     AND r1.cust_id=r2.cust_id 
     AND r1.rating_date>r2.rating_date 
     AND r1.rating_star<r2.rating_star 
    GROUP BY 
    r1.prod_id, 
    r1.cust_id) m 
    INNER JOIN customer on m.cust_id = customer.cust_id 
    INNER JOIN product ON m.product_id = product.product_id 
0

只需几点: 您不能在FROM子句中指定您在SELECT中指定属性的理智方式。您只能在FROM中使用单个表格,而对于每个使用的联结,您只能使用一个表格。 SELECT a,b,c FROM a; < ---------- fine SELECT a,b,c FROM a,b; < ----不好 SELECT a,b,c FROM a JOIN b; < ---很好

当谈到FROM/JOIN中的表时,你不要使用“AS”给它们一个别名,只是表名和后面的别名。

FROM atable a JOIN btable b; < - 这将别名a分配给“atable”,将b分配给“btable”。

您还必须指定共同属性,该表是怎么回事要加入:

客户JOIN评级customer.cust_id = rating.cust_id;

至于其他方面,您可以在语法关闭后制定正确的WHERE子句。