2012-11-27 157 views
0
SELECT DISTINCT(id_no), lastname, 
    (SELECT COUNT(purchasedate) num_of_purch 
    FROM sales JOIN Artist ON 
     sales.id = Artist.id_no 
     WHERE DATE_SUB(CURDATE(),INTERVAL 1 
          YEAR) <= purchasedate 
      ) AS num_of_purch 

FROM Artist 

此查詢返回所有藝術家的ID_no,以及他們的姓氏和購買總數,但我想指定哪些購買是哪個藝術家。幫助解決這個問題將會非常有用。MYSQL - 問題與子查詢

EDIT - DISTINCT(id_no)是多餘的,因爲它是主鍵。

回答

2

這說明銷售的每個artist_id數量:

SELECT artist.id_no, count(sales.id) as num_of_purch 
FROM artist left join sales on sales.id = artist.id_no 
WHERE DATE_SUB(CURDATE(), INTERVAL 1 YEAR) <= purchasedate 
GROUP BY artist.id 

要還返回姓氏,和所有的細節:

SELECT art_tot.id_no, art_tot.lastname, art_tot.num_of_purch, sales.* 
FROM (SELECT artist.id_no, artist.lastname, count(sales.id) as num_of_purch 
     FROM artist left join sales on sales.id = artist.id_no 
     WHERE DATE_SUB(CURDATE(), INTERVAL 1 YEAR) <= purchasedate 
     GOUP BY artist.id, artist.lastname) art_tot 
     left join sales on art_tot.id_no = sales.id 
+0

我特別喜歡你。 – user1854392

+0

:)我編輯並刪除了一個內部連接...它應該現在仍然可以工作 – fthiella

+0

哦,快速的事情。不是我需要的100%。基本上它列出了所有已購買藝術家,但我也需要沒有任何購買的藝術家。 – user1854392

1

這應該給你的藝術家和購買數量每位藝術家

select a.id_no, a.lastname, count(s.purchasedate) num_of_purch 
from artists a 
join sales s on a.id_no = s.id 
where date_sub(curdate(), interval 1 year) <= s.purchasedate 
group by a.id_no, a.lastname 
0

您應該使用GROUP BY來計算每位藝術家的人數。

而且您應該使用外連接來包含去年沒有銷售額的藝術家。

SELECT a.id_no, a.lastname, COUNT(s.purchasedate) AS num_of_purch 
FROM Artist a 
LEFT OUTER JOIN sales s ON s.id = a.id_no 
    AND s.purchasedate => CURDATE() - INTERVAL 1 YEAR 
GROUP BY a.id_no; 

PS:使用DISTINCT(id_no)是沒有意義的,不僅是因爲id_no上已經是一種獨特的鑰匙,但因爲DISTINCT始終適用於所有列在選擇列表中,即使你加括號,使它看起來像一個函數僅適用於一列。

+0

您的解決方案出現錯誤,說 SQL錯誤(1064):您的SQL語法錯誤;檢查對應於您的MySQL服務器版本的手冊,以在'=> CURDATE()'附近使用正確的語法' - INTERVAL 1年 GROUP BY A.id_no'at line 4 – user1854392