任何人都可以帮我一个简单的SQL查询吗?
这就是场景:我需要找到参加更多比赛的选手。比赛一直在不同的城市和不同的专业。下表更好地表达了我的意思:
亚军:约翰怀特
-----------------------------------------
| NY | Rome | Madrid | Los Angeles |
------------------------------------------------
| 100m | x | | x | |
------------------------------------------------
| 200m | | x | | x |
------------------------------------------------
| 400m | | | | |
------------------------------------------------
简而言之,我有一个包含以下字段的数据库:名称,城市,规格,我需要找到填充更多位置的跑步者,参加更多不同比赛的跑步者。 在“规格”字段中,如果他分别参加每个专业,则数据为100米或200米或300米 在该示例中,结果是John White - > 4
那么,我如何查询列出参加大部分比赛的前十名参赛者?我需要一张表格,显示参赛者的名字和他参加的比赛数量。
提前感谢您的帮助。如果您需要更多信息,请询问。
再见,马特
更新:简单来说,我想知道具有最大数量的城市规格字段的不同组合的前10名列表。我认为这是解释我答案的最佳逻辑方式。
以下是数据库的示例:
name city spec
-----------------------
john NY 100m
john Rome 200m
john Madrid 100m
john Los Ang 200m
mike Rome 200m
mike Rome 100m
我正在寻找的“前10名”将是以下内容:
john 4
mike 2
我希望现在一切都好。再见!
答案 0 :(得分:9)
也许你正在寻找这样的东西:
select name, count(distinct city) as attended
from competitions
group by name
order by 2 desc
limit 10;
此查询返回竞争对手及其参与的事件数,不包括重复项(同一事件中的100和200米)。如果您想计算所有外观,请删除 distinct 关键字,如果您想显示多功能性列表,请将 city 替换为不同的专业。查询的工作原理是计算属于同一名称的所有行,按该计数递减排序并将输出限制为十行。
更新:我认为OP需要按外观列出前10名竞争对手。因此,竞争对手的每条记录都算作一个:
select name, count(name) as attended
from competitions
group by name
order by 2 desc
limit 10;
白先生将获得4分,所有3个学科参加所有4项比赛的人将获得12分。
答案 1 :(得分:0)
城市或活动不会无关紧要吗?难道你不能只考虑一个城市中的协会,看看每个活动协会看起来像一个城市,反之亦然?我假设还有一个或两个连接表。但我会选择该人在该联接中出现的次数。
SELECT COUNT(*)
FROM city_runner
WHERE runnerid = ? #The runner's id? You gave so little for me to work with...
然后使用您的应用程序语言来确定谁是最棒的......
答案 2 :(得分:0)
这实际上在很大程度上取决于数据的结构。我可以想象你有一张表
city|name|spec
在这种情况下,您的解决方案很简单:
SELECT TOP 10 name, total_races
FROM (
SELECT COUNT(*) as total_races, name
FROM thattable
GROUP BY name
) as t1
ORDER BY total_races DESC
如果您的数据存储方式不同,查询将会有所不同,显然是
编辑:你的桌子真的是一样的。我将查询编辑为name
而不是runner
,但它仍然是相同的答案
答案 3 :(得分:0)
这样可以找到第n个最大数
SELECT TOP nth_largest_no * FROM Products Order by price desc
例如
SELECT TOP 10 * FROM Products Order by price desc;