2016-03-18 18 views
1
Table: Player 
----------------- 
| id | gameId | 
----------------- 
| 1 | 1  | 
----------------- 
| 2 | 1  | 
----------------- 
| 3 | 2  | 
----------------- 
| 4 | 1  | 
----------------- 

Table: Game 
---------- 
| gameId | 
---------- 
| 1 | 
---------- 
| 2 | 
---------- 

En fazla oyuncuyla oyuna sahip olmak istiyorum, bu durumda oyunda 1. Bu, denediğim şeydi, ama sorgumla 2 sütun aldım: gi ve sayıldı. Ben Aşağıdaki deneyebilirsiniz tek GIMysql'deki en yaygın FK'nin kimliği nasıl alınır?

SELECT gi, MAX(counted) FROM 
(
    SELECT gameId AS gi, COUNT(gameId) AS counted 
    FROM player 
    GROUP BY gameId 
) AS countens; 

cevap

0

almak istiyorum:

select `gameid` 
from `player` 
group by `gameid` 
having count(*) = (
    select count(*) 
    from `player` 
    group by `gameid` 
    order by count(*) desc 
    limit 1 
) 
-1

Aldırma, buldum! Yalnızca bir oyun istiyorsanız

SELECT gameId FROM(
    SELECT gameId, MAX(counted) FROM 
    (
     SELECT gameId, COUNT(gameId) AS counted 
     FROM player 
     GROUP BY gameId 
    ) AS countens 
)AS gi; 
+1

Bu, en yüksek "sayılan" değeri alır, ancak 'gameId' için döndürülen değer belirsizdir. Yani, geri dönen değerin en fazla oyuncuya sahip olan oyun için geçerli olacağının bir garantisi yoktur. MySQL dışındaki veritabanları, bu deyimle "select listesindeki aggregate değil, group by" ifadesini içeren bir hata oluşturur. Varsayılan olarak, bir MySQL uzantısı bu sorguyu çalışmasına izin verir. Sql_mode içinde ONLY_FULL_GROUP_BY dahil ederek bir hata döndürmek için MySQL'i alabiliriz. – spencer7593

0

, şunları kullanabilirsiniz:

SELECT gameId AS gi, COUNT(gameId) AS counted 
FROM player 
GROUP BY gameId 
ORDER BY counted DESC 
LIMIT 1; 

Not: Bu en yüksek puanlı oyunu döndürür. Bağlar varsa, keyfi bir bağ değeri seçilir.

İlgili konular