MySQL 嵌套选择
MySQL nested selection
我试图通过下表在在线练习页面上找出这个问题:
问题:
对于同一客户对同一产品进行评级的所有情况
不止一次,并且在某个时间点给了它较低的评级
比以前,return客户名,产品名,
以及给出的最低星级。
我似乎无法弄清楚为什么这不正确 - 有人能帮忙吗?
这是我目前所拥有的(没有样本数据):
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
此查询将 return 已被同一客户多次评论的产品的最低评级星级,其中任何较新的评级都低于较旧的评级:
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
然后您可以将此查询与产品和客户一起加入 table:
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
简单几点:
您不能像在 SELECT 中指定属性那样在 FROM 子句中指定 tables。 FROM 中只能有一个 table,每个 Join 都可以有一个。
SELECT a, b, c 来自 a; <----------很好
SELECT a, b, c 来自 a, b; <----不好
SELECT a, b, c 来自 a JOIN b; <---很好
说到FROM/JOIN中的table,不用"AS"给他们起别名,只是在table后面加上别名.
FROM atable a JOIN btable b; <--这将别名 a 分配给 "atable",将 b 分配给 "btable"。
您还必须指定要加入 table 的公共属性:
客户加入评分开启 customer.cust_id = rating.cust_id;
至于其余部分,一旦掌握了语法,您就可以计算出要使用的正确 WHERE 子句。
我试图通过下表在在线练习页面上找出这个问题:
问题: 对于同一客户对同一产品进行评级的所有情况 不止一次,并且在某个时间点给了它较低的评级 比以前,return客户名,产品名, 以及给出的最低星级。
我似乎无法弄清楚为什么这不正确 - 有人能帮忙吗?
这是我目前所拥有的(没有样本数据):
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
此查询将 return 已被同一客户多次评论的产品的最低评级星级,其中任何较新的评级都低于较旧的评级:
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
然后您可以将此查询与产品和客户一起加入 table:
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
简单几点: 您不能像在 SELECT 中指定属性那样在 FROM 子句中指定 tables。 FROM 中只能有一个 table,每个 Join 都可以有一个。 SELECT a, b, c 来自 a; <----------很好 SELECT a, b, c 来自 a, b; <----不好 SELECT a, b, c 来自 a JOIN b; <---很好
说到FROM/JOIN中的table,不用"AS"给他们起别名,只是在table后面加上别名.
FROM atable a JOIN btable b; <--这将别名 a 分配给 "atable",将 b 分配给 "btable"。
您还必须指定要加入 table 的公共属性:
客户加入评分开启 customer.cust_id = rating.cust_id;
至于其余部分,一旦掌握了语法,您就可以计算出要使用的正确 WHERE 子句。