Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


MySQL-fråga som bråkar med mig

Postades av 2008-03-03 00:11:02 - Jonas Oscarsson, i forum mysq, Tråden har 3 Kommentarer och lästs av 1284 personer

Hej,

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>


Svara

Sv: MySQL-fråga som bråkar med mig

Postades av 2008-03-03 00:27:16 - Niklas Jansson

Känner igen det väl, men vet inte om det är MySQL-specifikt, ett vanligt beteende eller korrekt enligt standarden.

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.


Svara

Sv: MySQL-fråga som bråkar med mig

Postades av 2008-03-03 09:54:12 - Thomas Vanhaniemi

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.

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


Svara

Sv:MySQL-fråga som bråkar med mig

Postades av 2008-03-03 15:58:12 - Jonas Oscarsson

Tack båda två!

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)?


Svara

Nyligen

  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo
  • 14:25 Tips på verktyg för att skapa QR-k
  • 14:23 Tips på verktyg för att skapa QR-k
  • 20:52 Fungerer innskuddsbonuser egentlig

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 153
27 952
271 704
765
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies