我想數清我的數據庫,每個國家的點擊次數, 其具有如下表:簡單地計算一個一對多
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類」)...
我在網上搜索了很多,但似乎每個人都在使用一張表(而不是三張)。我對這些「一對多」關係並不滿意。對不起,成爲這樣的新手!
任何想法,提示或建議將是有益的,在此先感謝!
偉大的答案!爲了記錄,我最終使用了一個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