Hej, Känner igen det väl, men vet inte om det är MySQL-specifikt, ett vanligt beteende eller korrekt enligt standarden. Jag är inte säker på om det fungerar direkt, men det är möjligt att något i stil med denna fråga kan hämta ut det du vill. Tack båda två!MySQL-fråga som bråkar med mig
Ska försöka förklara detta så tydligt som möjligt, men det är en ganska klurig fråga.
Nedan finns ett urval: F.KillerNicknameId = 4. Detta är i dagsläget hårdkodat; jag skulle istället vilja att denna parameter kom från N.NicknameId som finns i den tredje sub-SQL-frågan. Som ni ser fungerar det för fälten som kallas "Kills" och "Deaths" eftersom dessa använder N.NicknameId på nivån direkt under nivån där N.NicknameId deklareras. Det tredje fältet, FavoriteVictim, har i sin tur fler subfrågor, och det fungerar därmed inte att använda N.NicknameId i dessa. Är detta en känd begränsning i Mysql?
Kan jag gå runt den på något sätt?
Tack på förhand, jag förväntar mig knappt ett svar på detta då det måste se sjukt jobbigt ut när man klickar sig in på tråden ;)
<code>
SELECT IdentityId, Name, Kills, Deaths, MAX(KDRatio) AS KDRatio, FavoriteVictim FROM (
SELECT IdentityId, Name, Kills, Deaths, (Kills / Deaths) AS KDRatio, FavoriteVictim FROM (
SELECT
N.NicknameId,
N.IdentityId,
N.Name,
(SELECT COUNT(FragId) FROM Frags WHERE KillerNicknameId = N.NicknameId AND KillerNicknameId <> VictimNicknameId) AS Kills,
(SELECT COUNT(FragId) FROM Frags WHERE VictimNicknameId = N.NicknameId) AS Deaths,
(SELECT
CONCAT(CONCAT_WS(' (', Name, ROUND((FavoriteVictimKills / TotalKills) * 100)), ' %)') AS FavoriteVictim
FROM
(
SELECT
N1.Name,
COUNT(F.FragId) AS FavoriteVictimKills,
(SELECT COUNT(FragId) FROM Frags WHERE KillerNicknameId = 4) AS TotalKills
FROM Frags AS F
INNER JOIN Nicknames AS N1 ON N1.NicknameId = F.VictimNicknameId
WHERE F.KillerNicknameId = 4
GROUP BY F.VictimNicknameId
ORDER BY FavoriteVictimKills DESC LIMIT 1
) AS Temp) AS FavoriteVictim
FROM Nicknames AS N
)
AS Stats)
AS Stats2
GROUP BY IdentityId ASC
ORDER BY KDRatio DESC
</code>Sv: MySQL-fråga som bråkar med mig
Generellt så skulle jag nog köra med views istället för subselects, för att i steg ta ut det du vill ha. Det blir nog både mer aptitligt och enklare att se vad som händer då. Spontant ser det ut som att du istället skulle kunna joina med Frags där du har "=4" och på så sätt kunna använda N.NicknameID där.Sv: MySQL-fråga som bråkar med mig
SELECT n.IdentityId, n.Name, COUNT(DISTINCT k.FragId) Kills, COUNT(DISTINCT d.FragId) Deaths, (COUNT(DISTINCT k.FragId) / COUNT(DISTINCT d.FragId)) KDRatio, CONCAT(fv.Name, ' (', ROUND((fv.FavoriteVictimKills / fv.TotalKills) * 100), ' %)') FavoriteVictim FROM Nicknames n
LEFT OUTER JOIN Frags k ON k.KillerNicknameId = n.NicknameId AND k.KillerNicknameId <> k.VictimNicknameId
LEFT OUTER JOIN Frags d ON d.VictimNicknameId = n.NicknameId
LEFT OUTER JOIN (
SELECT vn.Name, COUNT(fvv.FragId) FavoriteVictimKills, COUNT(DISTINCT fvk.FragId) TotalKills, fvk.KillerNicknameId KillerNicknameId FROM Frags fvk
JOIN Frags fvv ON fvv.KillerNicknameId = fvk.KillerNicknameId
JOIN Nicknames vn ON vn.NicknameId = fvv.VictimNicknameId
WHERE fvk.KillerNicknameId = n.NicknameId
GROUP BY fvv.VictimNicknameId
ORDER BY FavoriteVictimKills DESC
LIMIT 1
) fv ON fv.KillerNicknameId = n.NicknameId
GROUP BY n.IdentityId
ORDER BY KDRatio DESC, n.IdentityId ASC
Sv:MySQL-fråga som bråkar med mig
Jag provade din fråga Thomas, men fick samma problem som i min. Den hittar inte "n.NicknameId" i WHERE-satsen. Jag provade också att köra subfrågan som är i den tredje LEFT OUTER JOIN-satsen med n.NicknameId = 4, vilket resulterade i att SQLyog hängde sig, serverns CPU-användning rasade upp till 80%-90% och jag fick starta om databasservern.
Jag tror dock att din approach är mer korrekt än min om man vill göra allt uppslag i en fråga, känns bättre att använda JOINs så som du gjort. Däremot tror jag att jag kommer att försöka dela upp frågan i Views som Niklas skrev och bena ut det på så vis istället (kanske kan få nytta av dessa views vid andra frågor sen också).
Det tråkiga med Views i MySQL (gentemot SQL Server) är att när man skapat sin snyggt formaterade SQL-fråga som utgör vyn och sedan tar "Alter" på vyn senare får man upp en omformaterad variant som i princip är omöjlig att läsa... någon som vet om det finns någon inställning som ger tillbaka samma SQL-fråga som angavs när vyn skapades, i samma format? Antar att jag får spara frågorna på textfiler annars...
EDIT: Kan också slänga in en annan fråga: Går det att på något sätt få ut radnumret för varje rad i en egen kolumn (1 till N där N är antalet rader)?