Avatar billede punnishment Nybegynder
24. marts 2002 - 21:24 Der er 17 kommentarer og
1 løsning

DISTINCT med ORDER BY

hvordan laver man et DISTINCT med ORDER BY ?

hvis der er forskel på de forskellige databaser så vil jeg meget gerne have det af vide i mySQL og MS Access tak.

Jeg vil hente de fem nyeste recorder i databasen (order by date) og de må ikke høre inde under samme kategori (distinct)

nogle der kan hjælpe?
Avatar billede coltau Juniormester
24. marts 2002 - 21:29 #1
SQL = "select tabelnavn.date from tabelnavn group by tabelnavn.date"

Group by gør det samme men sortere også som order by.
Avatar billede coltau Juniormester
24. marts 2002 - 21:30 #2
Pas på hvis du kalder feltnavnet for date da det er et reserveret ord. Anvend hellere ordet, dato.

SQL = "select dato from tabelnavn group by dato"

Det er også mere overskueligt.
Avatar billede coltau Juniormester
24. marts 2002 - 21:34 #3
Forskelle mellem MySql og Access. Ja.

Den mest kendte forskel.
MySql = "select * from where dato='" & strDato & "'"
MyAccess = "select * from where dato=#" & strDato & "#"

MySql kan ikke håndtere Ja/Nej felter som Access.
Avatar billede punnishment Nybegynder
24. marts 2002 - 21:35 #4
jeg ved - er ikke en amatør. det var bare lige et hurtigt eksempelt..! man kan jo os altid sætte [] udenom.

du siger jeg kan bruge

SQL = "SELECT DISTINCT id FROM tabel GROUP BY [date]" ???

du glemte ihvertifald at sætte distinct ind??
Avatar billede horsmark Nybegynder
24. marts 2002 - 21:36 #5
..ellers sæt dine tabeller i klammer som dette

SQL = "select [kollonnenavn] from tabelnavn group by [kollonnenavn]"

check disse sites ud...
www.sqlcourse.com
www.sqlcourse2.com
Avatar billede punnishment Nybegynder
24. marts 2002 - 21:37 #6
coltau>

jeg tror ikke du forstår mig. Når jeg mener forskel så mener jeg angående spørgsmålet altså har mysql en anden måde af order by ligesom access har group by?

igen, jeg er ikke amatør
Avatar billede punnishment Nybegynder
24. marts 2002 - 21:39 #7
forresten coltau...
Det er muligt at bruge navnet date, uden at sætte [] udenom!

Du bruger jo ikke date i nogle SQL kommando sammenhæng!
Avatar billede punnishment Nybegynder
24. marts 2002 - 21:45 #8
jeg læste lige dit indlæg igennen en gang til coltau.
du mener group by funktionen indholder distinct og order by funktionen?

jeg får ihvertifald en fejl meddelelse ligemeget om jeg bruger distinct eller jeg ikke gør:

Microsoft][ODBC Microsoft Access-driver] Du har forsøgt at køre en forespørgsel, der ikke medtager det angivne udtryk "Id" som en del af en aggregatfunktion.


SQL:
SQL = "SELECT TOP 5 Id FROM Poster GROUP BY date"
SQL = "SELECT DISTINCT TOP 5 Id FROM Poster GROUP BY date"


-----------
jeg bruger en access database i øjeblikket
Avatar billede coltau Juniormester
25. marts 2002 - 13:36 #9
Jeg har først haft tid til at kikke nu og jeg kan se at du har prøvet lidt af hvert.
Ja group by gør det samme som distinct - men jeg har lagt mærke til at begge kommandoer kræver at du gruppere på de samme felter som du udtrækker.

SQL = "SELECT TOP 5 Id FROM Poster GROUP BY date"
SQL = "SELECT DISTINCT TOP 5 Id FROM Poster GROUP BY date"

Begge kommadoner skal give samme udtræk - men der er en grund til at du ikke kan udtrække feltet ID grupperet på feltet, date. Hvis du tænker over det - hvilke ID skal SQL-sætningen så give dig. ?

Eksempel.
ID Date
1  12-12-2002
2  14-12-2002
3  12-12-2002

Ovennævnte eksempel. Hvilke ID vil du have i dit udtræk. ?
1 og 2 eller 2 og 3. Det er derfor dit eksempelt ikke virker.

Men - denne her virker.
SQL = "SELECT TOP 5 date FROM Poster GROUP BY date"
så vil du få. (12-12-2002 og 14-12-2002)

Du skal nok finde en anden måde at trække indholdet ud på.
Avatar billede punnishment Nybegynder
28. marts 2002 - 01:34 #10
hmm, jeg tror ikke det er det jeg præcist vil have...

Altså jeg vil have finde de fem nyeste poster (ingen fra samme kategori) og de skal udtrækkes på på den nyeste først måde..

Kan du omskrive denne her til en som virker?
SQL = "SELECT DISTINCT id, indhold, kat FROM tabel ORDER BY date DESC;"


Jeg vil meget gerne have alle detaljer med og hvordan sætter man rækkefølge på GROUP BY, bruger man os (ASC|DESC) ??
Avatar billede coltau Juniormester
28. marts 2002 - 14:27 #11
group by/order by anvendes nogenlunde som følgende.
select date,kat from tabel group by date,kat order by date eller kat

Jeg har siddet hele formiddagen og forsøgt at lave udtrækket. (Med kun en SQL-sætning) Jeg kan ikke bevise at det ikke kan lade sig gøre - men jeg kan forsøge at forklare hvorfor.
Du ønsker de fem nyeste indlæg - men den samme kategori må ikke gå igen 2 gange.

En SQL-sætning kan kun lave et udtræk hvis du kan angive en naturlig rækkefølge (order by) og derefter har du mulighed for at filtrere udtrækket (WHERE) og evt. gruppere udtrækket. (distinct)
I dit tilfælde skal order by være "date, kat" - men filtreringen skal tage hensyn til de poster, der allerede er fundet (kat må ikke findes 2 gange) og det kan den kun med group by eller distinct - men Group by arbejder på den måde at den sammensætter felterne (date,kat) til en entydig værdi og derfor kan den ikke skelne kun på kategorien. I øvrigt kan man med group by/distinct ikke få de øvrige felter med.

Pyha - er du med så langt.

Selvom du måske selv kan løse problemet på anden måde får du alligevel 2 alternative måder hvorpå det kan lade sig gøre.

1. 5 SQL-sætninger der hver især tager højde for det forgående resultat.
<%
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("test.mdb")

function VisTop5(strKats)
  if strKats = "" then
    Set RS = Conn.Execute("select top 1 * from tabel order by date desc")
    VisTop5 = RS("kat")
  else
    Set RS = Conn.Execute("select top 1 * from tabel where not kat in (" & strKats & ") order by date desc")
    VisTop5 = strKats & "," & RS("kat")
  end if
  Response.Write("ID: " & RS("ID") & " " & RS("kat") & " " & RS("Indhold") & "<br>")
end function

s = ""
for i = 1 to 5
  s = VisTop5(s)
next
%>

2. Gem en kopi af indlæg i en tabel der altid kun indeholder de 5 nyeste indlæg. Det må være noget med at hvis aktuelle kategori allerede findes i tabellen skal den erstattes med nyeste indlæg eller hvis kategori ikke findes i tabellen skal ældste indlæg erstattes med nyeste indlæg.

Håber du fik lidt ud af det.
Avatar billede punnishment Nybegynder
28. marts 2002 - 14:44 #12
Hmm, det burde ikke være så svært, men jeg vil prøve mig frem, når jeg konvatere systemet til en mysql database..

Jeg har 2 eksempler på sider der bruger et system alle dette jeg vil have..
Eksperten.dk & Solution2all.dk

De har bare det med at det er indlæg...! Altså de nyeste indlæg, og der er ingen af de samme spørgsmål, hvordan tror i de gør det?
Avatar billede punnishment Nybegynder
29. marts 2002 - 00:50 #13
Jeg fandt selv ud af en meget bedre løsning:

Jeg opretter et felt i kategori tabellen, hvor jeg skriver den nyeste post i kategoriens dato ned.

På den måde, kan jeg hente oplysninger direkte, uden jeg skal igennem en masse:

SQL = "SELECT TOP 5 title, id FROM kategori ORDER BY Newest DESC;"
Avatar billede coltau Juniormester
29. marts 2002 - 12:22 #14
Det var flot - så har du fortjent alle pointene selv. !
Avatar billede punnishment Nybegynder
29. marts 2002 - 15:33 #15
ja har jeg ikke det, når jeg selv finder løsningen?
hvad er det nu jeg vil frem til?
- en løsning!

sådan en kunne du ikke komme med, hvorfor så give dig de points?
Avatar billede coltau Juniormester
29. marts 2002 - 19:18 #16
Jeg gav dig to løsninger. Jeg havde endda testet den ene.

Hvis man vil have hjælp på eksperten skal man jo fordele pointene til dem der gider beskæftige sig med ens problem. Sommetider også selvom de ikke kommer med en løsning. Hvis man gør som du har gjort i dette tilfælde så kan det jo være at du ikke får svar.
Avatar billede punnishment Nybegynder
30. marts 2002 - 00:42 #17
jeg kunne ihvertifald ikke få nogen af dine løsninger til at virke.

Jeg kan godt se min fejl, jeg burde have givet dig nogle af pointsene for at vise interesse for spørgsmålet. Jeg synes bare det er spild af plads det med at der oprettes spørgsmål hvor der står (Points til ******) Også uddeler man lige points!

Det er fuldstændig spild af plads, og en af grundende til at eksperten.dk bliver langsomere!

men hvis du vil have dine points, så skal jeg nok oprette et spørgsmål?
Avatar billede coltau Juniormester
30. marts 2002 - 17:01 #18
Nej - jeg var bare lidt sur fordi jeg havde brugt mere end 2 timer på at teste dit problem og komme med to løsninger. Men hvis du får problemer med din egen løsning så opret et nyt ?.
Jeg kan jo se et lille problem hvis det kun er datoen du gemmer i kategorien. Jeg ville nok gemme ID sammen med.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester