WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Hjälp med avancerad SQL-sträng (https://www.wn.se/forum/showthread.php?t=1037830)

Lando 2009-09-06 00:04

Hjälp med avancerad SQL-sträng
 
Hej!

Jag behöver hjälp med SQL. Jag har en databas med testresultat och jag vill hämta ut de senaste 50 och sortera dem efter resultatet. tex:

SELECT * FROM resultat ORDER BY date DESC LIMIT 50.

Och sedan på denna strängen ORDER BY resultat DESC.

(Jag vet att man kan skriva ORDER BY date DESC, resultat DESC men det löser inte mitt problem).

Hjälp någon?

KarlRoos 2009-09-06 00:44

Hur ser resultat fältet ut? Är det en siffra?

Lando 2009-09-06 01:00

Citat:

Ursprungligen postat av KarlRoos (Inlägg 20320915)
Hur ser resultat fältet ut? Är det en siffra?

Svaret är ja

digiArt 2009-09-06 09:43

Principen som jag brukar nyttja:

SELECT * FROM Tabell WHERE PrimaryKey IN (SELECT TOP 50 PrimaryKey FROM Tabell ORDER BY DateCol) ORDER BY ResultCol

Kör du sql-server finns det alternativ med CTE (common table expressions) som är något effektivare.

Lando 2009-09-06 14:54

Jag får det inte riktigt att funka:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '50 res_id FROM test_result ORDER BY res_date) ORDER BY res_result

Så här ser SQLn ut:
SELECT * FROM test_result WHERE res_id IN (SELECT TOP 50 res_id FROM test_result ORDER BY res_date) ORDER BY res_result

Hjälp? :(

Reager 2009-09-06 15:41

TOP är för SQL-server, motsvarigheten i MySQL är Limit. Dock fungerar det inte att använda Limit i en IN-sats i MySQL (åtminstone inte den version som Binero kör vilket är femman tror jag)

Lando 2009-09-06 15:45

Faan också! Vad gör jag då?

RickardP 2009-09-06 16:13

Låter som du får ta ut resultatet ur första sql frågan och fixa sorteringen efteråt.

Lindahl 2009-09-06 19:30

Detta funkar i MySQL för mig:
SELECT * FROM (SELECT * FROM resultat ORDER BY date DESC LIMIT 50) AS s ORDER BY resultat DESC

Lando 2009-09-09 04:15

Perfekt!

Tusen tack! :D

Conny Westh 2009-09-09 07:59

Lindhl hann före men jag skulle valt Lindahls lösning för den är "rätt" tänkt...:

Kod:

SELECT *
FROM (SELECT *
          FROM resultat
          ORDER BY date DESC
          LIMIT 50
        ) AS s
ORDER BY resultat DESC


Magnus_A 2009-09-09 09:43

Citat:

Ursprungligen postat av Lindahl (Inlägg 20320976)
Detta funkar i MySQL för mig:
SELECT * FROM (SELECT * FROM resultat ORDER BY date DESC LIMIT 50) AS s ORDER BY resultat DESC

Lägg denna konstruktion på minnet, den är inte bara bra till att göra urval på en sortering och visa på en annan.
Man kan också kringgå Mysql:s förbud mot att välja ut och uppdatera i samma fråga. Om man vill uppdatera en tabell så att en rad får samma värde som en annan rad har,
t ex.
Kod:

Update tabell set kolumn=
  (select kolumn from tabell where index=värde)
where index=annatvärde

ger felmeddelande om att inte Mysql vill göra en subquery i samma sats som man uppdaterar.

Om man använder metoden ovan så blir det en ny temporär tabell, som vi kan ställa en fråga till så här:

Kod:

Update tabell set kolumn=
  ( select kolumn from 
    (select * from tabell) as x
  where index=värde )
where index=annatvärde

Läs mer på http://www.xaprb.com/blog/2006/06/23...rget-in-mysql/


Alla tider är GMT +2. Klockan är nu 22:17.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson