Gå til innhold

[Løst]Finne dublikater, henter ut eldste timestamp, hvordan få nyeste isteden?


Anbefalte innlegg

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
Videoannonse
Annonse
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 av quantum
Lenke til kommentar

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 av Goggen90
Lenke til kommentar
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 av quantum
Lenke til kommentar
*** 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 av quantum
Lenke til kommentar

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
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

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 av Goggen90
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...