从每个位置的数据库中获取获胜者 - 投票系统
Getting winners from database per position - Voting system
所以我的数据在 table 中是这种格式
Candidate Name Position ID Total Votes
_____________ _____________ _____________
Name 1 1 1
Name 2 1 3
Name 3 2 1
Name 4 2 4
Name 5 3 1
Name 6 3 5
如何获得每个位置的每个获胜者。我尝试了很多查询,但没有得到正确的结果。任何帮助将不胜感激。
让你的 table 由 t
表示。请注意,此查询确实为所有获胜者提供了最大票数。
with position_max(position, max_vote) as
(
select position, max(votes)
from t
group by position
)
select t.name, t.position
from t, position_max
where t.position=position_max.position and t.votes=position_max.max_vote;
没有 with
子句:
select t.name, t.position
from t
join (
select position, max(votes) as votes
from t
group by position
) ta on ta.position=t.position
where t.votes=ta.votes;
这是一个可能的解决方案,可能有点天真,但我似乎想不出更好的版本。
让我们考虑一个 table 的细节如下:
CREATE TABLE VOTING (Name TEXT, position integer, votes integer);
INSERT INTO VOTING VALUES("Name 1", 1, 1);
INSERT INTO VOTING VALUES("Name 2", 1, 3);
INSERT INTO VOTING VALUES("Name 3", 2, 1);
INSERT INTO VOTING VALUES("Name 4", 2, 4);
INSERT INTO VOTING VALUES("Name 5", 3, 1);
INSERT INTO VOTING VALUES("Name 6", 3, 5);
查询是:
SELECT name,
A.position,
votes
FROM voting A,
(SELECT position,
Max(votes) AS M
FROM voting
WHERE position IN (SELECT DISTINCT( position )
FROM voting)
GROUP BY position) B
WHERE A.position = B.position
AND A.votes = B.m;
我的思考过程如下:
- 首先 select 所有可能的不同
position
值。
- 对于每个不同的
position
检索该位置的 max(votes)
。
- 将
max(votes)
列附加到原始 table 中,其中 position
值匹配,这意味着对于每一行和位置对,该位置都有一个最大(投票数)可用.
- 过滤这个新的 table,其中位置匹配且原始投票值与最大(投票)值匹配,并且您有 table。您可以根据需要进一步订购
(ASC/DESC)
结果如下:
Name position votes
------ -------- -----
Name 2 1 3
Name 4 2 4
Name 6 3 5
这是 link 到 运行 的示例:http://sqlfiddle.com/#!9/8d7ce6/54/0
所以我的数据在 table 中是这种格式
Candidate Name Position ID Total Votes
_____________ _____________ _____________
Name 1 1 1
Name 2 1 3
Name 3 2 1
Name 4 2 4
Name 5 3 1
Name 6 3 5
如何获得每个位置的每个获胜者。我尝试了很多查询,但没有得到正确的结果。任何帮助将不胜感激。
让你的 table 由 t
表示。请注意,此查询确实为所有获胜者提供了最大票数。
with position_max(position, max_vote) as
(
select position, max(votes)
from t
group by position
)
select t.name, t.position
from t, position_max
where t.position=position_max.position and t.votes=position_max.max_vote;
没有 with
子句:
select t.name, t.position
from t
join (
select position, max(votes) as votes
from t
group by position
) ta on ta.position=t.position
where t.votes=ta.votes;
这是一个可能的解决方案,可能有点天真,但我似乎想不出更好的版本。
让我们考虑一个 table 的细节如下:
CREATE TABLE VOTING (Name TEXT, position integer, votes integer);
INSERT INTO VOTING VALUES("Name 1", 1, 1);
INSERT INTO VOTING VALUES("Name 2", 1, 3);
INSERT INTO VOTING VALUES("Name 3", 2, 1);
INSERT INTO VOTING VALUES("Name 4", 2, 4);
INSERT INTO VOTING VALUES("Name 5", 3, 1);
INSERT INTO VOTING VALUES("Name 6", 3, 5);
查询是:
SELECT name,
A.position,
votes
FROM voting A,
(SELECT position,
Max(votes) AS M
FROM voting
WHERE position IN (SELECT DISTINCT( position )
FROM voting)
GROUP BY position) B
WHERE A.position = B.position
AND A.votes = B.m;
我的思考过程如下:
- 首先 select 所有可能的不同
position
值。 - 对于每个不同的
position
检索该位置的max(votes)
。 - 将
max(votes)
列附加到原始 table 中,其中position
值匹配,这意味着对于每一行和位置对,该位置都有一个最大(投票数)可用. - 过滤这个新的 table,其中位置匹配且原始投票值与最大(投票)值匹配,并且您有 table。您可以根据需要进一步订购
(ASC/DESC)
结果如下:
Name position votes
------ -------- -----
Name 2 1 3
Name 4 2 4
Name 6 3 5
这是 link 到 运行 的示例:http://sqlfiddle.com/#!9/8d7ce6/54/0