MySQL - Need diğer tablolardaki bazı karşılık id sayma yardım

3 Cevap php

I adlı masa üzerinde players, daha sonra belirtilen diğer tablolar tries, conversions, penalties, dropgoals.

I players, ardından aşağıdaki saymak gelen player_id almak gerekir:

  • player_id tries en çok deneme sayısı
  • player_id conversions içinde için dönüşüm sayısı
  • player_id penalties içinde için ceza sayısı
  • player_id dropgoals en çok dropgoals sayısı

Ve bu bütün her oyun için yaklaşık on beş oyuncuları sitesi rugby ilgilidir, olduğu gibi tek seferde gerçekleşmesi gerekiyor.

Ben çalıştığı, aşağıdaki denedim:

SELECT players.player_id, players.number, CASE WHEN (COUNT(tries.player_id) = 0) THEN ' ' ELSE COUNT(tries.player_id) END AS nrTries FROM players LEFT JOIN tries ON players.player_id = tries.player_id WHERE players.team_id IS NULL GROUP BY players.player_id ORDER BY players.number

Bu players tablosundan tüm oyuncuları seçmek ve kendi çabalarım sayar, ama en kısa sürede şu şekilde değiştirin gibi bana bir hata veriyor:

SELECT players.player_id, players.number, player.name, CASE WHEN (COUNT(tries.player_id) = 0) THEN ' ' ELSE COUNT(tries.player_id) END AS nrTries FROM players, player LEFT JOIN tries ON players.player_id = tries.player_id WHERE players.player_id = player.player_id AND players.team_id IS NULL GROUP BY players.player_id ORDER BY players.number

It gives the following error:

Unknown column 'players.player_id' in 'on clause'

Bu bana lütfen yardım birisi, ben şimdi gün boyunca mücadele edilmiştir miyim?

Şimdiden teşekkürler

// edit:

Merhaba, tüm, ben bu kod bir oyuncu birden fazla tip attı zaman, her tür sayısını miscounts, çalışır ve dönüşümleri, ya da çalışır ve cezalar söylüyorlar ve yapılması haricinde, zekice çalışır, artık çok aptal hissediyorum hepsi aynı.

Benim oyuncu, 1 penaltı ve 3 dropgoals golü 3 cezalar ve 3 dropgoals gibi, ben yanlış anlamaya olamaz çıktılar diyelim.

İşte benim sorgu:

SELECT players.player_id, players.number, player.name, player.surname,
CASE WHEN (COUNT(tries.player_id) = 0) THEN '& nbsp;' ELSE COUNT(tries.player_id) END AS nrTries,
CASE WHEN (COUNT(conversions.player_id) = 0) THEN '& nbsp;' ELSE COUNT(conversions.player_id) END AS nrConversions,
CASE WHEN (COUNT(dropgoals.player_id) = 0) THEN '& nbsp;' ELSE COUNT(dropgoals.player_id) END AS nrDropgoals,
CASE WHEN (COUNT(penalties.player_id) = 0) THEN '& nbsp;' ELSE COUNT(penalties.player_id) END AS nrPenalties
FROM players
LEFT JOIN tries ON players.player_id = tries.player_id AND tries.game_id = '$game_id'
LEFT JOIN conversions ON players.player_id = conversions.player_id AND conversions.game_id = '$game_id'
LEFT JOIN dropgoals ON players.player_id = dropgoals.player_id AND dropgoals.game_id = '$game_id'
LEFT JOIN penalties ON players.player_id = penalties.player_id AND penalties.game_id = '$game_id'
LEFT JOIN player ON players.player_id = player.player_id
WHERE players.player_id = player.player_id AND players.team_id IS NULL AND players.game_id = '$game_id'
GROUP BY players.player_id ORDER BY players.number

*Please note: $game_id is a PHP variable.
Also: I have included a space between & and nbsp; otherwise it does not get ouputted to SO.*

Birisi bana doğru yönde işaret edebilir?

3 Cevap

Eğer Cletus doğru çözümü vardı belirtti ve özgün soru güncelleme sırasında kullanmak değil ilerledi neden biraz kafam karıştı. O dedi, Cletus'un 'çözüm biraz kapalı, sen () (SUM değil) COUNT gerekir. Aşağıdaki deneyin:

SELECT players.player_id,
(SELECT COUNT(*) FROM tries WHERE player_id = players.player_id) tries,
(SELECT COUNT(*) FROM penalties WHERE player_id = players.player_id) penalties
FROM players;

Bu 0'ın yerine & nbsp o uygulama kodunda olsa ele tavsiye ederim dönecektir. Eğer really mysql & nbsp almak istiyorsanız OLGU karmaşa ekleyebilirsiniz.

Orada oyuncu başına her ilişkili tabloda bir kayıt olduğunu ve orada o değilse NULL göstermek için mutluyuz varsayarak, verilerin ancak hakkında yeterli özel olmamıştır:

SELECT player_id, tries, conversions, penalties, dropgoals
FROM players p
LEFT JOIN tries t ON t.player_id = p.player_id
LEFT JOIN conversions c ON c.player_id = p.player_id
LEFT JOIN penalties e ON e.player_id = p.player_id
LEFT JOIN dropgoals d ON d.player_id = p.player_id

Bu şekilde yeniden ifade edilebilir

SELECT player_id
(SELECT tries FROM tries WHERE player_id = p.player_id) tries,
(SELECT conversions FROM conversions WHERE player_id = p.player_id) conversions,
(SELECT penalties FROM penalties WHERE player_id = p.player_id) penalties,
(SELECT dropgoals FROM dropgoals WHERE player_id = p.player_id) dropgoals
FROM players p

Performans veya veritabanı motoruna göre farklılık olmayabilir. Eğer bu özetlemek gerekiyorsa o şekilde değiştirin:

SELECT player_id
(SELECT SUM(tries) FROM tries WHERE player_id = p.player_id) tries,
(SELECT SUM(conversions) FROM conversions WHERE player_id = p.player_id) conversions,
(SELECT SUM(penalties) FROM penalties WHERE player_id = p.player_id) penalties,
(SELECT SUM(dropgoals) FROM dropgoals WHERE player_id = p.player_id) dropgoals
FROM players p

Yukarıdaki herhangi istenirse, yerine NULL 0 dönmek için IFNULL () veya benzer işlevleri kullanabilirsiniz.

Neden ikinci sorgu referans "oyuncu" mu? Seni Sadece bu kasıtlı emin yapma ("Oyuncuların DAN, oyuncu") ... başka bir yerde böyle bir tablo söz görmüyorum.

Bu açık ile (örn. "SOL JOIN") katılır karışmasını önlemek için yardımcı olabilir örtülü tutarlı yapısını korumak için, ("oyuncuları, oyuncu DAN", örneğin) katılır.