5

我收到了这个 MySQL 面试问题,这让我失去了这份工作的资格。

我去面试,被问到一个我无法回答的问题,我丢了工作。

他们问过。

我们有两个表,第一个表(主表)CANDIDATES包含字段:

  • candidate_id(首要的关键)
  • candidate_name

第二个表(子表)CANDIDATE_VOTES包含字段:

  • v_id(首要的关键)
  • candidate_id(外键)

每次投票时,候选人的candidate_key 都会放在孩子中。

CANDIDATE

=================================     
|candidate_id | candidate_Name  |  
|-------------------------------|  
| 1           | abc             |  
|-------------------------------|  
| 2           | xyz             |  
|-------------------------------|  
| 3           | etc             |  
|-------------------------------|  

CANDIDATE VOTES

==========================     
| votes_id | candidate_id |  
|-------------------------|  
| 1        | 1            |  
|-------------------------|  
| 2        | 1            |  
|-------------------------|  
| 3        | 2            |  
|-------------------------| 

问题是您将如何宣布获胜者

请帮我怎么做。

我尝试了很多,但找不到逻辑。

4

4 回答 4

8

您应该返回所有得票最多的候选人:

SELECT   candidates.*
FROM     candidates JOIN candidate_votes USING (candidate_id)
GROUP BY candidate_id
HAVING   COUNT(*) = (
  SELECT   COUNT(*)
  FROM     candidate_votes
  GROUP BY candidate_id
  ORDER BY votes DESC
  LIMIT    1
)

sqlfiddle上查看。

于 2012-08-29T11:04:36.690 回答
2

您可以使用 aCOUNT()来获取与每个候选人相关的总票数。通过连接这两个表,您可以返回candidate_name,如果您在查询中使用LIMITand ORDER BY,它将仅返回确定为获胜者的记录。

SELECT count(*) winner, c.candidate_Name
FROM candidates c
INNER JOIN candidate_votes cv
   ON c.candidate_id = cv.candidate_id
GROUP BY c.candidate_Name
ORDER BY winner desc
LIMIT 1  -- remove the LIMIT to see all records

请参阅带有演示的 SQL Fiddle

或 MySQL 允许GROUP BY对不在SELECT

SELECT count(*) winner, , c.candidate_Name
FROM candidates c
INNER JOIN candidate_votes cv
   ON c.candidate_id = cv.candidate_id
GROUP BY cv.candidate_id
ORDER BY winner desc
LIMIT 1 -- remove the LIMIT to see all records

请参阅带有演示的 SQL Fiddle

于 2012-08-29T11:00:59.517 回答
0
SELECT   CANDIDATE_NAME, count(*)
FROM     CANDIDATES, CANDIDATE_VOTES
WHERE    CANDIDATES.CANDIDATE_ID = CANDIDATE_VOTES.CANDIDATE_ID
GROUP BY CANDIDATE_NAME
ORDER BY count(*) DESC
LIMIT    1

SELECT:您选择候选人姓名+票数

FROM:使用两个表

WHERE:基本上是连接表的连接

GROUP BY:按候选人姓名对选票进行分组,SELECT 中的 count(*) 将显示分组为 1 行的行数(也就是每位候选人的票数)

ORDER BY:按票数从高到低排序

LIMIT:将只返回 1 行,删除此行以查看候选人和投票的完整列表

于 2012-08-29T11:05:27.113 回答
-1

有几种方法可以做到这一点。一种是使用 GROUP BY:

SELECT TOP 1 C.candidate_id, C.candidate_name, COUNT(1) NoOfVotes
FROM CANDIDATES C
INNER JOIN CANDIDATE_VOTES CV ON C.candidate_id = CV.candidate_id
GROUP BY C.candidate_id, , C.candidate_name
ORDER BY 3 DESC

该语句为每个投票创建一行,然后按候选人对这些行进行分组,并计算每个候选人的行数。然后它按每个候选人的计票排序并选择前 1 名(虽然不处理平局)。

编辑:此答案对 T-SQL (SQL Server) 有效。从其他答案看来,您需要在最后使用“LIMIT 1”而不是在 MySQL 的开头使用“TOP 1”。

于 2012-08-29T11:08:33.460 回答