nree Skrevet 3. desember 2009 Del Skrevet 3. desember 2009 SELECT datamaskin, ip, timestamp, brukernavn, COUNT(brukernavn) AS n FROM *** GROUP BY brukernavn HAVING n > 1 ORDER BY $order $ordertype; Denne spørringen skal finne dublikater på brukernavn, i tillegg vil jeg ha ut timestamp, datamaskin og ip fra den siste raden som ble lagt inn med det brukernavnet. Nå ligger det f.eks: id - brukernavn - timestamp - datamaskin 1 - ola - 123456789 - pc1 2 - ola - 456321789 - pc2 3 - ola - 654987321 - pc1 Når jeg kjører spørringen får jeg ut at ola har 3 rader (COUNT(brukernavn) AS n), men jeg får informasjonen fra raden med id1, ikke fra id3 som jeg egentlig vil ha. Noen som har en løsning på dette? Lenke til kommentar
quantum Skrevet 3. desember 2009 Del Skrevet 3. desember 2009 Noen som har en løsning på dette? Da tror jeg du må forklare hva det er med rad 3 som gjør at det er «The one» ... Lenke til kommentar
cruzader Skrevet 3. desember 2009 Del Skrevet 3. desember 2009 nr3 er vel "the one" siden timestampen der er høyest så det er siste inloggingen. Lenke til kommentar
quantum Skrevet 3. desember 2009 Del Skrevet 3. desember 2009 (endret) nr3 er vel "the one" siden timestampen der er høyest så det er siste inloggingen. hm, det står jo i overskriften ja ... må visst lese den også :o) spørringen din er ikke gyldig sql, mysql tillater det som en utvidelse, men du får da resultater deretter. når du bruker denne utvidelsen må evt. verdier i felt du tar med som det ikke grupperes på (som f.eks. timestamp) ha samme verdi i det utvalget du gjør. databasen kan fritt velge hvilken verdi den vil levere, og da får du uforutsigbare resultater når verdiene ikke er like. http://dev.mysql.com/doc/refman/5.1/en/gro...en-columns.html bytt ut timestamp med en subselect som velger max(timestamp) på de relevante radene. Endret 3. desember 2009 av quantum Lenke til kommentar
nree Skrevet 4. desember 2009 Forfatter Del Skrevet 4. desember 2009 (endret) Hvordan setter jeg den inn i den spørringen jeg allerede har? Prøvde meg, men det fungerte ikke SELECT id, datamaskin, ip, (select timestamp as timest from alarmlogg where brukernavn='brukernavn' order by timestamp DESC limit 1), brukernavn, COUNT(brukernavn) AS n FROM *** GROUP BY brukernavn HAVING n > 1 ORDER BY $order $ordertype; Endret 4. desember 2009 av Goggen90 Lenke til kommentar
quantum Skrevet 4. desember 2009 Del Skrevet 4. desember 2009 (endret) Hvordan setter jeg den inn i den spørringen jeg allerede har? Prøvde meg, men det fungerte ikke SELECT id, datamaskin, ip, (select timestamp as timest from alarmlogg where brukernavn='brukernavn' order by timestamp DESC limit 1), brukernavn, COUNT(brukernavn) AS n FROM *** GROUP BY brukernavn HAVING n > 1 ORDER BY $order $ordertype; Brukeren din heter 'ola', ikke 'brukernavn' ... bruk også funksjonen max, istedenfor limit og order by. *** har jeg ingen formening om hva gjør, desverre, men når du kan hardkode tabellnavnet i subselect'en så må du vel kunne det i den ytre også? Det gir heller ikke mening å ha et alias for timestamp i subselect'en, det vil jo ikke være synlig utenfor subselect-scope. Prøv noe sånt som SELECT a1.id, a1.datamaskin, a1.ip, (select max(a2.timestamp) from alarmlogg a2 where a2.brukernavn =a1.brukernavn) as latest_timestamp, a1.brukernavn, COUNT(a1.brukernavn) AS n FROM alarmlogg a1 GROUP BY a1.brukernavn HAVING n > 1 ORDER BY $order $ordertype; Merk at du fortsatt har flere kolonner du vil kunne få uforutsigbare resultater i. Endret 4. desember 2009 av quantum Lenke til kommentar
nree Skrevet 4. desember 2009 Forfatter Del Skrevet 4. desember 2009 *** er bare byttet ut fra tabellnavnet alarmlogg. Er det mulig å gjøre dette på en annen måte uten å få uforutsigbare resultater på kolonnene? Vil helst ikke kjøre èn spørring pr. rad heller. (PHP) Lenke til kommentar
quantum Skrevet 4. desember 2009 Del Skrevet 4. desember 2009 (endret) *** er bare byttet ut fra tabellnavnet alarmlogg. Er det mulig å gjøre dette på en annen måte uten å få uforutsigbare resultater på kolonnene? Vil helst ikke kjøre èn spørring pr. rad heller. (PHP) Du mener kanskje en spørring pr. uforutsigbar kolonne. Nei, du må enten til med subselects på de andre uforutsigbare kolonnene også, eller gjøre som manualen sier, sørge for at kolonnene har samme verdi i alle rader innenfor hver gruppering, slik at det ikke spiller noen rolle hva som blir valgt. Subselects kan ofte skrives om til joins, ref https://www.diskusjon.no/index.php?showtopic=1176735 men jeg synes det er mindre lesbart (og skrivbart). Dog kan det være enklere for databsen å optimalisere. Innvendingene om at join-spørringene ikke vil virke i den tråden er feil. EDIT: Nå ser jeg hva du skriver du vil ha i 1. innlegg og da kan du kanskje gjøre slik: Gitt denne tabellen select * from alarmlogg order by timestmp 1 ola 2009-12-04 15:32:21.0 pc1 192.168.1.2 2 ola 2009-12-04 15:32:40.0 pc2 192.168.1.3 3 ola 2009-12-04 15:32:53.0 pc1 192.168.1.4 4 pelle 2009-12-04 15:33:12.0 pc3 192.168.1.3 5 pelle 2009-12-04 15:40:52.0 pc2 192.168.1.8 Da vil denne spørringen select a1.brukernavn, count(a1.brukernavn) as n, a2.datamaskin, a2.timestmp, a2.ip from alarmlogg a1 left join alarmlogg a2 on a1.brukernavn = a2.brukernavn and a2.timestmp = (select max(a3.timestmp) from alarmlogg a3 where a3.brukernavn = a1.brukernavn) group by brukernavn having n > 1 gi deg dette ola 3 pc1 2009-12-04 15:32:53.0 192.168.1.4 pelle 2 pc2 2009-12-04 15:40:52.0 192.168.1.8 Endret 4. desember 2009 av quantum Lenke til kommentar
Azidops Skrevet 6. desember 2009 Del Skrevet 6. desember 2009 Vil bare kommentere en ting jeg synes er viktig. Det er ikke lurt å bruke brukernavn som unik identifikator. Det kan jo være flere som heter Ola. Da har du et problem med å skille Ola 1 i fra Ola 2. Brukere bør identifiseres ved et brukernummer. Dermed kan det være to forskjellige Ola'er i databasen. Lenke til kommentar
quantum Skrevet 7. desember 2009 Del Skrevet 7. desember 2009 Det er ikke lurt å bruke brukernavn som unik identifikator. Det kan jo være flere som heter Ola. Da har du et problem med å skille Ola 1 i fra Ola 2. Brukere bør identifiseres ved et brukernummer. Dermed kan det være to forskjellige Ola'er i databasen. Nå må vi vel tenke oss litt om her kanskje? Lenke til kommentar
nree Skrevet 7. desember 2009 Forfatter Del Skrevet 7. desember 2009 (endret) Flott quantum, fungerte akkuratt slik jeg håpet timestmp (som forresten er timestamp i tabellen ) er forresten unix timestamp, men det fungerte uansett Vil bare kommentere en ting jeg synes er viktig. Det er ikke lurt å bruke brukernavn som unik identifikator. Det kan jo være flere som heter Ola. Da har du et problem med å skille Ola 1 i fra Ola 2. Brukere bør identifiseres ved et brukernummer. Dermed kan det være to forskjellige Ola'er i databasen. Selv om Ola A. og Ola B. har bruker i systemet har de ikke samme brukernavn Dette er kun et webinterface for et helt annet system som mater databasen. Endret 7. desember 2009 av Goggen90 Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå