Permalänk
Medlem

Hjälp med SQL

Jag håller på med en enklare hemsida i asp.net och har kört fast lite.
SQL frågor är inte min starka sida direkt så hoppas nån av er kan hjälpa mig.

Jag har en tabell där en av kolumnerna håller reda på vilket datum posten skapades.
Jag vill ha tre sql frågor som hämtar ut tre olika saker.

Första frågan ska hämta ut alla poster med det senaste datumet.
Säg tex att jag la in 10 poster 2008-04-01, då ska alla de posterna hämtas.

Nästa fråga ska hämta ut alla poster med det senaste datumet INNAN i detta fallet 2008-04-01.
Om jag tex har poster som skapade 2008-03-21 så ska dom hämtas.

Tredje frågan ska hämta ut de poster med tredje nyast datum, tex 2008-02-20.

Poster som är äldre än i detta fallet 2008-02-20 ska inte hämtas öht.

Detta ska ju skötas automatiskt, så när jag postar nya poster så ska ju det nyaste datumet sättas in i fråga ett.

Lite luddigt förklarat men hoppas ni förstår, annars får jag försöka förklara bättre.

Tacksam för hjälp.

Visa signatur

...

Permalänk

Ett snabbt och aningen fult förslag:

(Otestade)

SELECT [...] FROM tabell WHERE PostDate IS NOT NULL AND PostDate = ( SELECT MAX(PostDate) FROM tabell WHERE PostDate IS NOT NULL ) SELECT [...] FROM tabell WHERE PostDate IS NOT NULL AND PostDate < ( SELECT MAX(PostDate) FROM tabell WHERE PostDate IS NOT NULL ) SELECT [...] FROM tabell WHERE PostDate IS NOT NULL AND PostDate = ( SELECT MAX(PostDate) FROM tabell WHERE PostDate IS NOT NULL AND PostDate < ( SELECT MAX(PostDate) FROM tabell WHERE PostDate IS NOT NULL AND PostDate < ( SELECT MAX(PostDate) FROM tabell WHERE PostDate IS NOT NULL ) ) ) )

Visa signatur

"Mies saa kaatua mutta ei karata." -- Adolf Ehrnrooth IR 7, Äyräpää 1944.

Permalänk
Medlem

Ska iväg så han bara testa väldigt snabbt, första funkade galant, dock så funkade inte dom andra två.
Men har inte testat ordentligt så kanske bara jag som missade något.
Får ta en närmare titt senare.

tack så länge

Visa signatur

...

Permalänk

Jag testade frågorna mot en mysql-databas och de fungerade som jag hade förstått att du vill att det skulle göra:

1. Endast nyaste (med senaste datum)
2. Alla förutom de nyaste.
3. Endast de tredje nyaste (de med ett datum som är tidigare än två andra datum)

Förvånansvärt bra svarstider f.ö. på en tabell med ett par tusen rader.

/TT

EDIT: Om du i andra frågan också endast vill ha näst nyaste (endast de med näst nyaste datum) ser den ut som följande:

SELECT [...] FROM tabell WHERE PostDate IS NOT NULL AND PostDate = ( SELECT MAX(PostDate) FROM tabell WHERE PostDate IS NOT NULL AND PostDate < ( SELECT MAX(PostDate) FROM tabell WHERE PostDate IS NOT NULL ) )

Visa signatur

"Mies saa kaatua mutta ei karata." -- Adolf Ehrnrooth IR 7, Äyräpää 1944.

Permalänk

Hm, känns det inte vettigare att köra någon sorts GROUP BY PostDate LIMIT 3? Är det tvungen att det måste vara tre olika frågor? Det känns inte särskilt optimerat.

Visa signatur

www.uu.se - some kind of university | www.hirr.org.uk - ain't no mountain high enough | www.bajenfans.se

Permalänk

Mjo, men nån större skillnad med tanke på svarstiderna tror jag inte det blir.

Orsaken till att jag skrev frågorna som jag gjorde är dels att de är ganska enkla att förstå och dels att de inte behöver temporära tabeller (typ SELECT (...) AS tablename) i MSSQL). Jag vet inte ens om MySQL stöder sån syntax?

Problemet är väl att få "tredje sista". Att få tre sista är inget problem:

SELECT PostDate FROM table GROUP BY PostDate ORDER BY PostDate DESC LIMIT 3

Men hur får man på enklast sätt ut sista därifrån, utan att använda en temporär tabell?

Visa signatur

"Mies saa kaatua mutta ei karata." -- Adolf Ehrnrooth IR 7, Äyräpää 1944.

Permalänk
Medlem

Nu testade jag lite mer och allt funkar jättebra verkar det som, så stort tack för hjälpen

Visa signatur

...

Permalänk

Nåjo, hade hjärnsläpp igår. Här är en snyggare lösning:

1. X=0 (senaste)
2. X=1 (näst senaste)
3. X=2 (tredje senaste)

SELECT [...] FROM table WHERE PostDate = ( SELECT PostDate FROM table GROUP BY PostDate ORDER BY PostDate DESC LIMIT X, 1 )

Eller om man inte gillar sub-selectar:

SELECT [...] FROM table JOIN (SELECT PostDate FROM table GROUP BY PostDate ORDER BY PostDate DESC LIMIT X, 1 ) AS TempTable ON (table.PostDate = TempTable.PostDate)

Visa signatur

"Mies saa kaatua mutta ei karata." -- Adolf Ehrnrooth IR 7, Äyräpää 1944.