/ 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
MySQL og mærkelig SELECT output
Fra : JD


Dato : 10-07-06 13:10

Jeg har grublet over denne query i snart 3 dage ny og jeg forstår det
simpelthen bare ikke! Jeg mistænker lidt MySQL for at have en bug, men jeg
har lige nu her opgraderet til nyeste version, 5.0.23 og det er stadigt
samme fejl. Det køre på en FreeBSD 6.1 og jeg har selv kompileret det hele.

Jeg kan ikke få min DISTINCT query til at vise det korrekte output.
Problemet er beskrevet nedenstående.

Definationer:
id_host = INT
ldate = TIMESTAMP

1) Denne query viser det "originale" output - sådan som det ser ud, hvis
ikke man vælger DISTINCT. Listen viser en samling hosts udfra hvornår de
sidst er scannet (blot rækkefølgen). Jeg bruger ikke denne query til noget
udover til at vise det originale output:

SELECT id_host FROM child ORDER BY ldate DESC LIMIT 20
273
273
127
214
2795
2101
272
77
271
270
15
269
268
267
266
265
264
2794
263
262

2) Meningen er at jeg med denne nedenstående liste får vist alle hosts,
sorteret efter sidste scannings dato, og hvor hosten kun er vist én gang.
Listen er helt forkert, da nogle hosts-ID's slet ikke vises i listen (f.eks.
127 og 214 m.v.)!?

SELECT DISTINCT id_host FROM child ORDER BY ldate DESC LIMIT 20
273
2795
272
271
270
269
268
267
266
265
264
2794
263
262
261
260
259
258
257
256

Min SELECT under 2) *BURDE* have givet dette output:
273
127
214
2795
2101
272
77
271
270
15
269
268
267
266
265
264
2794
263
262

Måske kunne jeg lave det anderledes, men nu er det blevet en princip sag for
mig, i det mindste at finde ud af HVORFOR skidtet ikke fungere!? Gør jeg
noget forkert rent database mæssigt?



 
 
JD (10-07-2006)
Kommentar
Fra : JD


Dato : 10-07-06 22:20

> Jeg har grublet over denne query i snart 3 dage ny og jeg forstår det
> simpelthen bare ikke! Jeg mistænker lidt MySQL for at have en bug, men jeg
> har lige nu her opgraderet til nyeste version, 5.0.23 og det er stadigt
> samme fejl. Det køre på en FreeBSD 6.1 og jeg har selv kompileret det
> hele.
>
> Jeg kan ikke få min DISTINCT query til at vise det korrekte output.

Er der slet ingen idéer til denne? Jeg har prøvet en GROUP BY også (istedet
for DISTINCT) men det er samme underlige resultat?



P.E. Nikolajsen (11-07-2006)
Kommentar
Fra : P.E. Nikolajsen


Dato : 11-07-06 13:16

Gæt:
Kan problemet ligge i DESC LIMIT 20 ???

Da vi jo ikke kendet ldate værdierne kan det være vanskeligt at se om de
korrekte 20 data af id_host kommer med.

"JD" <jonh@doe.xyz> wrote in message
news:44b243b3$0$20267$edfadb0f@dread16.news.tele.dk...
> Jeg har grublet over denne query i snart 3 dage ny og jeg forstår det
> simpelthen bare ikke! Jeg mistænker lidt MySQL for at have en bug, men jeg
> har lige nu her opgraderet til nyeste version, 5.0.23 og det er stadigt
> samme fejl. Det køre på en FreeBSD 6.1 og jeg har selv kompileret det
hele.
>
> Jeg kan ikke få min DISTINCT query til at vise det korrekte output.
> Problemet er beskrevet nedenstående.
>
> Definationer:
> id_host = INT
> ldate = TIMESTAMP
>
> 1) Denne query viser det "originale" output - sådan som det ser ud, hvis
> ikke man vælger DISTINCT. Listen viser en samling hosts udfra hvornår de
> sidst er scannet (blot rækkefølgen). Jeg bruger ikke denne query til noget
> udover til at vise det originale output:
>
> SELECT id_host FROM child ORDER BY ldate DESC LIMIT 20
> 273
> 273
> 127
> 214
> 2795
> 2101
> 272
> 77
> 271
> 270
> 15
> 269
> 268
> 267
> 266
> 265
> 264
> 2794
> 263
> 262
>
> 2) Meningen er at jeg med denne nedenstående liste får vist alle hosts,
> sorteret efter sidste scannings dato, og hvor hosten kun er vist én gang.
> Listen er helt forkert, da nogle hosts-ID's slet ikke vises i listen
(f.eks.
> 127 og 214 m.v.)!?
>
> SELECT DISTINCT id_host FROM child ORDER BY ldate DESC LIMIT 20
> 273
> 2795
> 272
> 271
> 270
> 269
> 268
> 267
> 266
> 265
> 264
> 2794
> 263
> 262
> 261
> 260
> 259
> 258
> 257
> 256
>
> Min SELECT under 2) *BURDE* have givet dette output:
> 273
> 127
> 214
> 2795
> 2101
> 272
> 77
> 271
> 270
> 15
> 269
> 268
> 267
> 266
> 265
> 264
> 2794
> 263
> 262
>
> Måske kunne jeg lave det anderledes, men nu er det blevet en princip sag
for
> mig, i det mindste at finde ud af HVORFOR skidtet ikke fungere!? Gør jeg
> noget forkert rent database mæssigt?
>
>



JD (11-07-2006)
Kommentar
Fra : JD


Dato : 11-07-06 13:33

> Gæt:
> Kan problemet ligge i DESC LIMIT 20 ???
>
> Da vi jo ikke kendet ldate værdierne kan det være vanskeligt at se om de
> korrekte 20 data af id_host kommer med.

Jeg har spurgt i den internationale database også og der har jeg fundet fram
til, at hvis jeg bruger følgende SELECT, så virker det uden problemer. Jeg
har kan ikke se forskellen?

Virker:
select id_host, ldate from test
group by id_host
order by max(ldate) desc

Virker ikke:
select id_host, max(ldate) from test
group by id_host
order by ldate desc

Jeg kan selvfølgelig godt se forskellen på hvor MAX står, men hvad er
forskellen rent database mæssigt? "ldate" er blot en timestamp, hvor det er
sorteret efter nyeste dato øverst.



Michael Zedeler (16-07-2006)
Kommentar
Fra : Michael Zedeler


Dato : 16-07-06 23:50

JD wrote:
>>Gæt:
>>Kan problemet ligge i DESC LIMIT 20 ???
>>
>>Da vi jo ikke kendet ldate værdierne kan det være vanskeligt at se om de
>>korrekte 20 data af id_host kommer med.
>
>
> Jeg har spurgt i den internationale database også

Jeg synes at det fremgår ret tydeligt af

1152562869.577460.276510@m79g2000cwm.googlegroups.com

hvad problemet er. Nu har du netop undladt at bringe hele tabellen,
hvilket betyder at folkene her i dk.edb.databaser (som nok ikke er helt
så skrappe som i comp.databases) ikke har indset hvor mærkelig din
forespørgsel egentlig er.

Din oprindelige forespøgsel var:

SELECT id_host FROM child ORDER BY ldate DESC LIMIT 20

Her er et eksempel:

id   stamp
A   10
A   20
A   30
A   40
B   5

SELECT id FROM mintabelovenfor
ORDER BY stamp DESC LIMIT 3

Er det så underligt at resultatet nødvendigvis er

id   stamp
A   20
A   30
A   40

Det er tydeligt at du ønsker en række for hvert id med den højeste værdi
fra stamp, men det er klart ikke det, du beder om.

Så kommer så dine nye forespørgsler, som egentlig er endnu mere underlige:

> og der har jeg fundet fram
> til, at hvis jeg bruger følgende SELECT, så virker det uden problemer.
> Jeg har kan ikke se forskellen?
>
> Virker:
> select id_host, ldate from test
> group by id_host
> order by max(ldate) desc

Den forespørgsel er mere tricky, end den ser ud til, for du beder om at
få en række pr. id_host, men disse id'er skal dernæst sorteres efter
hvilken der optræder med den højeste ldate-værdi. Men når du også tager
ldate med blandt de felter, som skal med i resultatet, falder det i mine
øjne helt fra hinanden. Hvis der er flere ldate-værdier, er det
tilfældigt hvilken en, mysql vælger for dig. Der burde stå

select id_host, max(ldate) from test
group by id_host
order by max(ldate) desc

Her er et eksempel:

id_host   ldate
1   10
1   20
1   30
2   1
3   1

Her er tre eksempler på mulige resultater. Så vidt jeg kan se, er de
alle gyldige svar på din version af forespørgslen:

id_host   ldate
1   10
2   1
3   1

id_host   ldate
1   20
2   1
3   1

id_host   ldate
1   30
2   1
3   1

Jeg tror at det er et rent lykketræf at resultatet tilsyneladende passer.

> Virker ikke:
> select id_host, max(ldate) from test
> group by id_host
> order by ldate desc

Det er klart. Du kan ikke sortere efter et felt, som ikke optræder i
GROUP BY.

Nælste gang er det nok en god idé at bringe alle de felter, problemet
gælder

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
I am less likely to answer usenet postings by anonymous authors.
Visit my home page at http://michael.zedeler.dk/

Michael Zedeler (17-07-2006)
Kommentar
Fra : Michael Zedeler


Dato : 17-07-06 11:18

Michael Zedeler wrote:
> JD wrote:
>
> > Virker ikke:
> > select id_host, max(ldate) from test
> > group by id_host
> > order by ldate desc
>
> Det er klart. Du kan ikke sortere efter et felt, som ikke optræder i
> GROUP BY.

....eller optræder som aggregat (f. eks. max(ldate)).

--
Which is more dangerous? TV guided missiles or TV guided families?
I am less likely to answer usenet postings by anonymous authors.
Visit my home page at http://michael.zedeler.dk/

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

Månedens bedste
Årets bedste
Sidste års bedste