我想用下面的表格在线想出一个做法页面上这样一个问题:MySQL的嵌套选择
问题: 对于所有案件中,额定同一客户同一产品 不止一次,并在某些时间点给它比以前更低的评分 ,返回客户名称,产品名称, 和给出的最低星级评分。
我似乎无法弄清楚为什么这是不正确的 - 任何人都可以提供帮助吗?
我想用下面的表格在线想出一个做法页面上这样一个问题:MySQL的嵌套选择
问题: 对于所有案件中,额定同一客户同一产品 不止一次,并在某些时间点给它比以前更低的评分 ,返回客户名称,产品名称, 和给出的最低星级评分。
我似乎无法弄清楚为什么这是不正确的 - 任何人都可以提供帮助吗?
这里是我到目前为止(无样本数据):
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
太棒了!在第七行,这应该是Rating.cust_id = Customer.cust_id not prod_id – RandomMath
你在哪里检查评级应该在未来?你甚至不检查评级应该不同。 – Adish
很高兴这得到你在找什么。 –
这个查询将返回已经由同一客户审查一次以上产品的最低评级星星,与任何较新的收视率比旧的等级较低:
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
只需几点: 您不能在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子句。
您需要连接条件(切换到现代显式连接语法。)还需要GROUP BY。 – jarlh
您可以添加示例数据吗?我正在为你做点什么。 –