/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Sortering i mysql
Fra : Michael Hansen


Dato : 16-12-02 19:16

Hejsa NG !

Jeg har en mysql tabel hvor der er følgende kolonner: id, parentID og tid.
Hvordan trækker jeg data ud af tabellen så det bliver sorteret efter BÅDE
parentID og tid, men med parentID som hovedprioritet ???

Altså så det ser således ud :

id - parentID - tid
101 - 1 - 50
103 - 1 - 51
102 - 1 - 52
100 - 2 - 48
105 - 2 - 49
104 - 3 - 53

--
Mvh
Michael Hansen



 
 
Mads Lie Jensen (16-12-2002)
Kommentar
Fra : Mads Lie Jensen


Dato : 16-12-02 19:32

On Mon, 16 Dec 2002 19:16:20 +0100, "Michael Hansen" <michael@amweb.dk>
wrote:

>Jeg har en mysql tabel hvor der er følgende kolonner: id, parentID og tid.
>Hvordan trækker jeg data ud af tabellen så det bliver sorteret efter BÅDE
>parentID og tid, men med parentID som hovedprioritet ???

SELECT id, parentID, tid FROM tabel ORDER BY parentID, tid;

--
Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
http://www.gartneriet.dk
- First name: Mads
- The name you typed contains a word or phrase that Hotmail does not allow.

Michael Hansen (16-12-2002)
Kommentar
Fra : Michael Hansen


Dato : 16-12-02 22:16

<SNIP>
> SELECT id, parentID, tid FROM tabel ORDER BY parentID, tid;

Ok mange tak

Har et spørgsmål mere:

Hvordan sorterer man det så således at den gruppe (defineret af parentID),
der har den største værdi i kolonnen tid, står øverst.

Som herunder:

id - parentID - tid
100 - 2 - 53
105 - 2 - 49
101 - 1 - 51
103 - 1 - 50
102 - 1 - 48
104 - 3 - 47

--
Mvh
Michael Hansen



Nis Jorgensen (17-12-2002)
Kommentar
Fra : Nis Jorgensen


Dato : 17-12-02 10:25

On Mon, 16 Dec 2002 22:15:46 +0100, "Michael Hansen"
<michael@amweb.dk> wrote:

><SNIP>
>> SELECT id, parentID, tid FROM tabel ORDER BY parentID, tid;
>
>Ok mange tak
>
>Har et spørgsmål mere:
>
>Hvordan sorterer man det så således at den gruppe (defineret af parentID),
>der har den største værdi i kolonnen tid, står øverst.
>
>Som herunder:
>
>id - parentID - tid
>100 - 2 - 53
>105 - 2 - 49
>101 - 1 - 51
>103 - 1 - 50
>102 - 1 - 48
>104 - 3 - 47

Den er lidt mere tricky - specielt i mysql. Prøv denne her

SELECT t1.id, t1.parentID, t1.tid, Max(t2.tid)
FROM tabel t1 INNER JOIN tabel t2 ON t1.parentid = t2.parentID
GROUP BY t1.id, t1.parentID, t1.tid
ORDER BY MAX(t2.tid) DESC, parentID, tid DESC;

--
Nis Jørgensen
Amsterdam

Please include only relevant quotes, and reply below the quoted text. Thanks

Michael Hansen (17-12-2002)
Kommentar
Fra : Michael Hansen


Dato : 17-12-02 14:41

<SNIP>
> SELECT t1.id, t1.parentID, t1.tid, Max(t2.tid)
> FROM tabel t1 INNER JOIN tabel t2 ON t1.parentid = t2.parentID
> GROUP BY t1.id, t1.parentID, t1.tid
> ORDER BY MAX(t2.tid) DESC, parentID, tid DESC;

Ok TAK !
Men hvad er t1 og t2 ?

--
Mvh
Michael Hansen



Jens Gyldenkærne Cla~ (17-12-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 17-12-02 15:16

Michael Hansen skrev:

>> SELECT t1.id, t1.parentID, t1.tid, Max(t2.tid)
>> FROM tabel t1 INNER JOIN tabel t2 ON t1.parentid = t2.parentID
>> GROUP BY t1.id, t1.parentID, t1.tid
>> ORDER BY MAX(t2.tid) DESC, parentID, tid DESC;

> Men hvad er t1 og t2 ?

2 aliaser for tabellen "tabel". De oprettes ved at skrive dem
umiddelbart efter tabelnavnet under FROM:

SELECT <felter>
FROM myTabel t
WHERE t.myFelt = 45

Herover er det ret ligegyldigt at benytte alias - men det er
praktisk hvis man har flere tabeller med:

SELECT t.felt1, t2.felt4
FROM myTabel1 t INNER JOIN myTabel2 t2
ON t.joinfelt = t2.joinfelt
WHERE t2.felt3 = 'Peter'

Hvis man ikke benyttede alias skulle "t." og "t2." erstattes med
"myTabel1." og "myTabel2" alle steder.
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma
(rettelser modtages gerne i dk.kultur.sprog)

Michael Hansen (17-12-2002)
Kommentar
Fra : Michael Hansen


Dato : 17-12-02 17:14

<SNIP>
> 2 aliaser for tabellen "tabel". De oprettes ved at skrive dem
> umiddelbart efter tabelnavnet under FROM:

Ok ganske smart ! Jeg har nu skrevet følgende i php men det funker ikke:

$result = mysql_query("
SELECT t1.rootID, t1.parentID, t1.time, Max(t2.time)
FROM indlag t1 INNER JOIN indlag t2 ON t1.parentID = t2.parentID
GROUP BY t1.rootID, t1.parentID, t1.time
ORDER BY MAX(t2.time) DESC, parentID, time DESC
LIMIT $offset,$limit
");

Hva pokker gør jeg forkert ??

--
Mvh
Michael Hansen



Mads Lie Jensen (17-12-2002)
Kommentar
Fra : Mads Lie Jensen


Dato : 17-12-02 18:53

On Tue, 17 Dec 2002 17:14:07 +0100, "Michael Hansen" <michael@amweb.dk>
wrote:

><SNIP>
>> 2 aliaser for tabellen "tabel". De oprettes ved at skrive dem
>> umiddelbart efter tabelnavnet under FROM:
>
>Ok ganske smart ! Jeg har nu skrevet følgende i php men det funker ikke:

"funker ikke"-fejlbeskeden er en af de mere stride fejlbeskeder. Det kan
jo være hvad som helst der går galt.

Hvis du i stedet skriver hvilken fejlbesked mySQL giver, så er det nok
noget nemmere at hjælpe.


--
Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
http://www.gartneriet.dk
- First name: Mads
- The name you typed contains a word or phrase that Hotmail does not allow.

Michael Hansen (18-12-2002)
Kommentar
Fra : Michael Hansen


Dato : 18-12-02 11:08

<SNIP>
> Hvis du i stedet skriver hvilken fejlbesked mySQL giver, så er det nok
> noget nemmere at hjælpe.

Hehe ja sorry, troede at I lige kunne se det ud af koden hvad der var galt

Nå men her har i så hvad MySQL siger til det: "Invalid use of group
function"

Og det er dette jeg skriver:
SELECT t1.rootID, t1.parentID, t1.time, Max(t2.time)
FROM indlag t1 INNER JOIN indlag t2 ON t1.parentID = t2.parentID
GROUP BY t1.rootID, t1.parentID, t1.time
ORDER BY MAX(t2.time) DESC, parentID, time DESC

--
Mvh
Michael Hansen



Jesper Brunholm (18-12-2002)
Kommentar
Fra : Jesper Brunholm


Dato : 18-12-02 14:26

Michael Hansen wrote:

> Nå men her har i så hvad MySQL siger til det: "Invalid use of group
> function"

Jeg har ikke mødt fejlmeddelelsen før, men jeg er imponeret over at du
har fået lov til at kalde en kolonne for "time"... Jeg vil klart foreslå
at du ændrer kolonnen til at hedde "time_" eller lignende, og
konsekvensretter i queryen...

> Og det er dette jeg skriver:
> SELECT t1.rootID, t1.parentID, t1.time, Max(t2.time)

mvh

Jesper Brunholm
--
H.C. Andersen-Centret med nyt design: <http://www.andersen.sdu.dk/>
Phønix - dansk folk-musik fra unge musikere - <http://www.phonixfolk.dk/>


Michael Hansen (19-12-2002)
Kommentar
Fra : Michael Hansen


Dato : 19-12-02 18:09

<SNIP>
> Jeg har ikke mødt fejlmeddelelsen før, men jeg er imponeret over at du
> har fået lov til at kalde en kolonne for "time"... Jeg vil klart foreslå
> at du ændrer kolonnen til at hedde "time_" eller lignende, og
> konsekvensretter i queryen...

Det hjalp desværre heller ikke. Ingen forskel

--
Mvh
Michael Hansen



[5000] Jesper Brunho~ (20-12-2002)
Kommentar
Fra : [5000] Jesper Brunho~


Dato : 20-12-02 15:05

Michael Hansen wrote:
> <SNIP>
>
>>Jeg har ikke mødt fejlmeddelelsen før, men jeg er imponeret over at du
>>har fået lov til at kalde en kolonne for "time"... Jeg vil klart foreslå
>>at du ændrer kolonnen til at hedde "time_" eller lignende, og
>>konsekvensretter i queryen...
>
>
> Det hjalp desværre heller ikke. Ingen forskel

Nej - og i mellemtiden er jeg selv løbet ind i samme problem som
sandsynligvis går ud på at man ikke kan lave group-selects, såsom avg,
count, max osv sammen med regulære selects i mysql, således må jeg gerne:

SELECT ID, count(ID) as Antal, Titel
FROM billeder GROUP BY ID!=0

(men det er ikke mere værd end blot count(ID) )

hvorimod

SELECT ID, count( ID ) as Antal, Titel
FROM billeder

giver fejlmeddelelsen

Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns
is illegal if there is no GROUP BY clause

Jeg ved godt at du _har_ en GROUP BY, men jeg tror ikke desto mindre at
det er samme problem du er ude i.

Måske var det en idé at starte en separat tråd om
"ordinære kolonner og group selects i mysql" eller lignende, for at
kunne fange folk som ved noget om dette, men som ikke læser med i denne
tråd fordi subject ikke er ret specifikt til problemet (hvis jeg har ret
i at det er det der er problemet )?

Alternativt ville jeg nok prøve at lave query'en genopbygget fra noget
så basalt som muligt, og så opdage hvornår den går 'itu'...

mvh

Jesper Brunholm


Kristian Damm Jensen (20-12-2002)
Kommentar
Fra : Kristian Damm Jensen


Dato : 20-12-02 15:31

Michael Hansen wrote:
>
> <SNIP>
> > Hvis du i stedet skriver hvilken fejlbesked mySQL giver, så er det nok
> > noget nemmere at hjælpe.
>
> Hehe ja sorry, troede at I lige kunne se det ud af koden hvad der var galt
>
> Nå men her har i så hvad MySQL siger til det: "Invalid use of group
> function"
>
> Og det er dette jeg skriver:
> SELECT t1.rootID, t1.parentID, t1.time, Max(t2.time)
> FROM indlag t1 INNER JOIN indlag t2 ON t1.parentID = t2.parentID
> GROUP BY t1.rootID, t1.parentID, t1.time
> ORDER BY MAX(t2.time) DESC, parentID, time DESC

Jeg er ikke overbevist om, at det er muligt at angive aggregate
functions i order by-klausulen.

Prøv at give Max(t2.time) et alias i select-klausulen, og brug dette
alias til at sortere efter.


--
Kristian Damm Jensen | Feed the hungry at www.thehungersite.com
kristian-damm.jensen@cgey.com | Two wrongs doesn't make a right,
ICQ# 146728724 | but three lefts do.


Michael Hansen (20-12-2002)
Kommentar
Fra : Michael Hansen


Dato : 20-12-02 16:35

<SNIP>
> Prøv at give Max(t2.time) et alias i select-klausulen, og brug dette
> alias til at sortere efter.

Halløjsa !! Det var noget der virkede !!!

Du har hermed tittel af "dagens mand i skysovs" !

TAK !!!

--
Mvh
Michael Hansen



Jens Gyldenkærne Cla~ (18-12-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 18-12-02 11:16

Michael Hansen skrev:

> Hehe ja sorry, troede at I lige kunne se det ud af koden hvad
> der var galt

Det er altid lettere når man kender fejlmeddelelsen.

> Nå men her har i så hvad MySQL siger til det: "Invalid use of
> group function"

O.k.


> SELECT t1.rootID, t1.parentID, t1.time, Max(t2.time)
> FROM indlag t1 INNER JOIN indlag t2 ON t1.parentID =
> t2.parentID GROUP BY t1.rootID, t1.parentID, t1.time
> ORDER BY MAX(t2.time) DESC, parentID, time DESC

2 forslag fra en der ikke kender noget specielt til mySQL.

a) Prøv at fjerne "ORDER BY"-linjen
b) "time" er måske et reserveret ord - prøv at sætte det i [] (alle
steder)
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma
(rettelser modtages gerne i dk.kultur.sprog)

Michael Hansen (18-12-2002)
Kommentar
Fra : Michael Hansen


Dato : 18-12-02 11:42

<SNIP>
> a) Prøv at fjerne "ORDER BY"-linjen
Jep det hjalp at fjerne "ORDER BY"-linjen, så den må åbenbart indeholde
fejl.

> b) "time" er måske et reserveret ord - prøv at sætte det i [] (alle
> steder)
Hjælper ikke, den kommer istedet med fejlen:
"You have an error in your SQL syntax near '[t1.time], Max([t2.time])"

--
Mvh
Michael Hansen



Jens Gyldenkærne Cla~ (18-12-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 18-12-02 11:50

Michael Hansen skrev:

>> a) Prøv at fjerne "ORDER BY"-linjen

> Jep det hjalp at fjerne "ORDER BY"-linjen, så den må åbenbart
> indeholde fejl.

Vi kigger lige på den igen:

| ORDER BY MAX(t2.time) DESC, parentID, time DESC

Jo, der var den - feltet time findes jo i både t1 og t2. Derfor kan
du ikke referere til det uden tabelpræfiks. Udskift "time DESC" med
"t1.time DESC" eller "t2.time DESC".


>> b) "time" er måske et reserveret ord - prøv at sætte det i []
>> (alle steder)

> Hjælper ikke, den kommer istedet med fejlen:
> "You have an error in your SQL syntax near '[t1.time],
> Max([t2.time])"

Det er fordi du kun skal indklamme feltnavnet: t1.[time]
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma
(rettelser modtages gerne i dk.kultur.sprog)

Michael Hansen (18-12-2002)
Kommentar
Fra : Michael Hansen


Dato : 18-12-02 11:58

<SNIP>
> Jo, der var den - feltet time findes jo i både t1 og t2. Derfor kan
> du ikke referere til det uden tabelpræfiks. Udskift "time DESC" med
> "t1.time DESC" eller "t2.time DESC".

Hmmm øv det giver stadig samme fejl, altså den med group.

> Det er fordi du kun skal indklamme feltnavnet: t1.[time]

"You have an error in your SQL syntax near '[time], Max(t2.[time])"

--
Mvh
Michael Hansen



Jens Gyldenkærne Cla~ (18-12-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 18-12-02 12:12

Michael Hansen skrev:

> "You have an error in your SQL syntax near '[time],
> Max(t2.[time])"

time må ikke stå alene når feltet findes i mere end én tabel. Det
er underordnet om der er klammer om eller ej. Prøv at skrive hele
din sqlstreng hvis det stadig ikke virker.

--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma
(rettelser modtages gerne i dk.kultur.sprog)

Michael Hansen (18-12-2002)
Kommentar
Fra : Michael Hansen


Dato : 18-12-02 14:36

<SNIP>
> time må ikke stå alene når feltet findes i mere end én tabel. Det
> er underordnet om der er klammer om eller ej. Prøv at skrive hele
> din sqlstreng hvis det stadig ikke virker.

Jeg skriver følgende SQL-streng:

SELECT t1.rootID, t1.parentID, t1.[time], Max(t2.[time])
FROM indlag t1 INNER JOIN indlag t2 ON t1.parentID = t2.parentID
GROUP BY t1.rootID, t1.parentID, t1.[time]
ORDER BY MAX(t2.[time]) DESC, parentID, t1.[time] DESC

Og SQL returnerer:

"You have an error in your SQL syntax near '[time], Max(t2.[time])"

Hmmm men måske kan vi lave det på en anden måde... Her er hvad jeg jeg har
brug for:

Jeg skal trække alle de rækker ud hvor parentID=0. Disse rækker kalder vi
for "hovedrækker". Hver af disse hovedrækker har nogle "underrækker", som
refererer tilbage til "hovedrækken", ved at underrækkens parentID er lig med
hovedrækkens rootID.
Hovedrækkerne skal så sorteres således at hvis en hovedrække har den
underrække med den største værdi i time feltet blandt alle indlæg, så skal
hovedrækken stå øverst på listen af hovedrækker.

Mysql skal altså KUN returnere rækker hvor parentID='0'. Men vel og mærke i
den rigtige rækkefølge.

Det skal bruges i et forum som jeg er ved at lave i php. Det indlæg der
sidst er besvaret skal stå øverst på listen over spørgsmål.
Håber ikke det lyder alt for indviklet.

--
Mvh
Michael Hansen



Jens Gyldenkærne Cla~ (18-12-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 18-12-02 15:01

Michael Hansen skrev:

> SELECT t1.rootID, t1.parentID, t1.[time], Max(t2.[time])
> FROM indlag t1 INNER JOIN indlag t2 ON t1.parentID =
> t2.parentID GROUP BY t1.rootID, t1.parentID, t1.[time]
> ORDER BY MAX(t2.[time]) DESC, parentID, t1.[time] DESC

Hm - den ser fin ud herfra.

> "You have an error in your SQL syntax near '[time],
> Max(t2.[time])"

- men måske er []-syntaksen ikke gyldig i mysql. Prøv at fjerne
dem igen (den oprindelige fejl har formentlig været det manglende
tabelpræfiks i slutlinjen).
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma
(rettelser modtages gerne i dk.kultur.sprog)

Michael Hansen (18-12-2002)
Kommentar
Fra : Michael Hansen


Dato : 18-12-02 16:33

<SNIP>
> - men måske er []-syntaksen ikke gyldig i mysql. Prøv at fjerne
> dem igen (den oprindelige fejl har formentlig været det manglende
> tabelpræfiks i slutlinjen).

Hmmm nu har jeg fjernet klammerne men den oprindelige group-fejl kommer
stadig.

Har du et forslag til at lave det som jeg beskrev i sidste indlæg ?

--
Mvh
Michael Hansen



Jesper Brunholm (19-12-2002)
Kommentar
Fra : Jesper Brunholm


Dato : 19-12-02 09:56

Michael Hansen wrote:
>> - men måske er []-syntaksen ikke gyldig i mysql. Prøv at fjerne
>>dem igen (den oprindelige fejl har formentlig været det manglende
>>tabelpræfiks i slutlinjen).
>
>
> Hmmm nu har jeg fjernet klammerne men den oprindelige group-fejl kommer
> stadig.

Du har læst mit indlæg kl 14.xx i denne tråd ikke?

mvh

Jesper Brunholm


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste