2011-10-05 141 views
0

我有這些疑問:MySQL查詢計算列

SELECT a.Id, a.Name, (SELECT COUNT(Id) FROM b WHERE b.IdTableA = a.Id) AS Num 
FROM a 
ORDER BY a.Name 

B表對錶FK一(IdTableA) 在這種情況下,是有效的?有沒有其他方法可以做到這一點?

的另一個問題是:

SELECT client.Id, client.Name 
    ,(SELECT SUM(projects) FROM projects WHERE IdClient = client.Id) AS projects 
FROM client 

這件怎麼樣?

有時候我們需要使用一個以上的計算列(SELECT SUM),甚至10或15

我們非常擔心,因爲表項目的表現可能有超過50萬分的記錄。

我讀過將那些SUMS存儲在表中,並在數據更改時更新該表可能會更好地提高性能。但是,這不利於標準化...

請幫我這兩個查詢...

感謝

+0

你已經回答了你的問題。如果您想對其進行優化,請將SUMS存儲在表中,並在數據更改後進行更新。規範化不存在妨礙數據庫設計。最後,計算機爲人們服務,你不必遵守準則,就好像你的生活依賴於它。如果我是你,我會存儲SUM並查詢它們,而不是統計每條記錄的行數。 –

回答

2
SELECT a.Id, a.Name, (SELECT COUNT(Id) FROM b WHERE b.IdTableA = a.Id) AS Num 
FROM a 
ORDER BY a.Name 

能可能被改寫爲

SELECT a.Id, a.Name, COUNT(b.Id) AS Num 
FROM a JOIN b ON b.IdTableA = a.Id 
GROUP BY a.Id, a.Name 
ORDER BY a.Name 

攜帶的風險較小被MySQL錯誤執行。

當您有比寫入(或寫入允許速度慢,但讀取速度要快)時,可以存儲數據總和以便於檢索。通常情況下,您使用數據倉庫:倉庫存儲彙總數據,OLTP數據庫存儲單個行。