2015-11-18 98 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子句。