2012-03-11 64 views
4

我想數清我的數據庫,每個國家的點擊次數, 其具有如下表:簡單地計算一個一對多

mysql> use DB; show tables; 
+--------------+ 
| Tables_in_DB | 
+--------------+ 
| Hits   | 
| Tags   | 
| HitTags  | 
+--------------+ 

這裏是從這些表的一些例子列:

mysql> select * from Hits; 
+---------+----------+--------------+ 
| HitID | HitDate | HitText  |  
+---------+----------+--------------+ 
|| 01/01/12 | access page1 | 
| 789| 01/02/12 | access page2 | 
| 4567890 | 01/03/12 | access page3 | 
+---------+----------+--------------+ 

mysql> select * from Tags; 
+-----------+---------+---------+ 
| TagID  | TagType | TagText |  
+-----------+---------+---------+ 
| 123123213 | country | USA  | 
| 456456456 | country | Brazil | 
| 789789789 | country | China | 
|| city | London | 
+-----------+---------+---------+ 

mysql> select * from HitTags; 
+---------+-----------+ 
| HitID | TagID  | 
+---------+-----------+ 
|| 123123213 | 
| 789| 456456456 | 
| 4567890 | 789789789 | 
+---------+-----------+ 

我想獲取每個國家的點擊次數, 如下面的SQL查詢{和僞代碼}:

SELECT DISTINCT TagText, TagID FROM Tags 
    WHERE TagType = 'country'; 

for each $row { 
    SELECT COUNT(HitID) As HitCount FROM HitTags 
     WHERE HitTags.TagID = $row[Tags.TagID]; 
} 

我在使用單獨查詢時沒有問題, ,但我確信有更好的方法可以做到這一點 (即,使用單個SQL查詢而不是每個國家/地區)。

也許使用JOIN,也許使用ANY關鍵字。 或者可能使用一些嵌套的SELECT語句?

這是我曾嘗試:

SELECT COUNT(HitID) AS HitCount, TagText FROM HitTags 
    JOIN Tags ON Tags.TagID = 
    ANY (SELECT TagID FROM Tags WHERE TagType = 'country'); 

但是,它返回一個單行,設總命中(來自世界各地,儘管國家與結果一起列出)。

理想的情況下,結果會是這樣的:

+---------+----------+ 
| TagText | HitCount | 
+---------+----------+ 
|  USA |  1234 | 
| Brazil |  5678 | 
| China |  9012 | 
+---------+----------+ 

我知道這一定是很常見(如「是的,我認爲這在MySQL 101類」)...

我在網上搜索了很多,但似乎每個人都在使用一張表(而不是三張)。我對這些「一對多」關係並不滿意。對不起,成爲這樣的新手!

任何想法,提示或建議將是有益的,在此先感謝!

回答

5

你只是缺少一個GROUP BY條款:

SELECT 
    COUNT(HitID) AS HitCount, 
    TagText 
FROM HitTags 
    JOIN Tags ON Tags.TagID = 
    ANY (SELECT TagID FROM Tags WHERE TagType = 'country') 
GROUP BY TagText; 

其實,這是一個LEFT JOIN更好:

SELECT 
    COUNT(HitID) AS HitCount, 
    TagText 
FROM 
    Tags 
    LEFT JOIN HitTags ON Tags.TagID = HitTags.TagID 
GROUP BY TagText 
+0

偉大的答案!爲了記錄,我最終使用了一個INNER連接(而不是一個LEFT連接),結果查詢如下所示:'SELECT DISTINCT TagText,COUNT(DISTINCT HitID)AS HitCount FROM標籤LEFT JOIN HitTags ON Tags.TagID = LogTags.TagID WHERE TagType ='country'GROUP BY TagText;' – 2012-03-11 06:38:49

1

試試這個:

SELECT *, (SELECT COUNT(HitID) FROM HitTags WHERE TagID = t.TagID) AS hit_count 
FROM Tags t WHERE TagType = 'country' 

這會做同樣的但我認爲更快。

0

請嘗試以下

SELECT COUNT(HitID) AS HitCount, TagText FROM HitTags 
JOIN Tags ON Tags.TagID = 
ANY (SELECT TagID FROM Tags WHERE TagType = 'country') 
group by TagText