5

私はこのMySQL面接の質問を与えられたので、私はその仕事に失格になりました。

面接に行って、返事ができない質問をされて失業しました。

彼らは尋ねた。

2つのテーブルがあり、最初のテーブル(マスターテーブル)にはCANDIDATESフィールドがあります。

  • candidate_id(primary_key)
  • candidate_name

2番目のテーブル(子テーブル)には、次の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

を使用しCOUNT()て、各候補に関連付けられた投票の総数を取得できます。2つのテーブルを結合することにより、を返すことができます。クエリでとcandidate_nameを使用するLIMITORDER 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 FiddlewithDemoを参照してください

またはMySQLはGROUP BYSELECT

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 FiddlewithDemoを参照してください

于 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

選択:候補者名+投票数を選択します

FROM:両方のテーブルを使用

場所:基本的に、テーブルをリンクするための結合

GROUP BY:候補者名ごとに投票をグループ化します。SELECTのcount(*)は、1行にグループ化された行数(候補者ごとの投票数)を示します。

ORDER BY:投票数の高いものから低いものへの順序

制限:1行のみを返します。この行を削除して、候補者と投票の完全なリストを表示します

于 2012-08-29T11:05:27.113 に答える
-1

これにはいくつかの方法があります。1つは、GROUPBYを使用することです。

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つの行を作成し、候補ごとにこれらの行をグループ化し、候補ごとにいくつの行があるかをカウントします。次に、候補者ごとにカウントされた投票数で並べ替え、上位1つを選択します(ただし、同点は扱いません)。

編集:この回答はT-SQL(SQL Server)に有効です。他の回答から、MySQLの最初の「TOP1」ではなく、最後の「LIMIT1」を使用する必要があるようです。

于 2012-08-29T11:08:33.460 に答える