我正在尝试计算数据库中每个国家/地区的点击次数, 其中包含以下表格:
mysql> use DB; show tables;
+--------------+
| Tables_in_DB |
+--------------+
| Hits |
| Tags |
| HitTags |
+--------------+
以下是这些表中的一些示例列:
mysql> select * from Hits;
+---------+----------+--------------+
| HitID | HitDate | HitText |
+---------+----------+--------------+
| 0123456 | 01/01/12 | access page1 |
| 7890123 | 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 |
| 012345678 | city | London |
+-----------+---------+---------+
mysql> select * from HitTags;
+---------+-----------+
| HitID | TagID |
+---------+-----------+
| 0123456 | 123123213 |
| 7890123 | 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中看到了这一点”)...
我在网上搜索了很多,但每个人似乎都在使用一张桌子(而不是三张桌子)。我对那些“一对多”的关系真的不太好。很抱歉成为这样的新手!
任何想法,提示或建议都会有用,提前谢谢!
答案 0 :(得分: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
答案 1 :(得分:1)
试试这个:
SELECT *, (SELECT COUNT(HitID) FROM HitTags WHERE TagID = t.TagID ) AS hit_count
FROM Tags t WHERE TagType = 'country'
这会做同样的事情,但我认为更快。
答案 2 :(得分: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