2012-06-22 25 views
-1

在我們的組織中,實現特定目標的成員可以獲得不同的獎勵。 管理層希望認可今年有史以來第一次獲得某些獎項的會員,而不是今年可能再次獲得特定獎勵的會員。我們不能只選擇那些獲得任何類型獎勵的人,因爲他們今年可能獲得兩次或更多獎項(有史以來第一次)。MYSQL可能是一個加入

我嘗試了各種方法,但他們都匹配太多的成員。一個簡單的程序語言搜索可能會從今年獲得一個或多個特定獎項的所有成員開始,然後拒絕那些在過去一年中獲得任何獎項的成員,但我不能拿出SQL去做。

該獎項表約爲400K條記錄,其中包括獎項,獎項,成員名稱。

回答

0

這似乎工作:

SELECT DISTINCT memberName FROM awards WHERE YEAR(awardDate) = '2012' AND (memberName NOT IN (SELECT memberName FROM awards WHERE (YEAR(awardDate) < '2012'))) 
+0

工程,但運行時間相當長(超過一分鐘)。想到任何優化? –

+0

好的,我創建了一個臨時表來保存WHERE子句中的表的結果,現在它非常快。謝謝! –

1

只是頭腦風暴,但也許這樣的事情會工作?

SELECT `Membername` 
FROM `award_table` 
WHERE (YEAR(awarddate) = 2012) && 
     (`Membername` NOT IN (SELECT `Membername` 
          FROM `award_table` 
          WHERE (`awarddate` BETWEEN `1950-01-01` AND `2011-12-31`))

編輯:只是重新閱讀,看看你有40萬行......這種方式可能過於昂貴的資源。

+2

使用'YEAR(awarddate)= 2012',使用通配符:)當然 –

+0

是不是有些瘋狂'LIKE'操作!爲了我自己的利益,總是打字太快。感謝您指出這一點。 –

+0

它不會經常運行,所以性能不是一個考慮因素,但是很重要。 –

1

您或許可以執行一些涉及WHERE NOT EXISTS子句和子查詢的子查詢,這些子查詢會在以前幾年查找匹配獎項,但如果不瞭解數據庫架構的詳細信息,很難提供具體答案。

另一種可能性:GROUP BY標識獎勵的列,取各組的min(awarddate),並在HAVING條款中過濾掉今年之前的值。

+0

這是我最近的嘗試。內部SELECT自身運行會給出預期的結果,但外部聯接不會返回任何結果。 SELECT Thisyear.Membername,a.Award,a.Awarddate,COUNT(*)作爲oldawards FROM獎勵 INNER JOIN( SELECT成員名稱 FROM獎勵 WHERE獎= '抄送' AND awarddate> '2011-12-31' ORDER BY成員名稱 )Thisyear USING(成員名稱) WHERE a.Awarddate < '2012-01-01' GROUP BY a.Membername HAVING oldawards = 0 –