Avatar billede webcreator Nybegynder
25. juli 2003 - 23:13 Der er 15 kommentarer og
2 løsninger

Flere ens poster - opdater kun den nyeste (timestamp)

Hej.

Min SQL streng :

mysql_query("UPDATE online SET time = now() WHERE IPnr = '$IPnr'") or die(mysql_error());

Problemet er, at der er en masse nøjagtigt ens poster (bortset fra tallet i timestamp). Jeg ønsker, at det KUN er den nyeste post, der bliver updateret.

Kan dette gøres i SQL ?
Avatar billede arne_v Ekspert
25. juli 2003 - 23:29 #1
Find nyeste record med:

SELECT MAX(time) FROM online WHERE IPnr = xxx

opdater den med:

UPDATE online SET time = now() WHERE IPnr = xxx AND time = nn
Avatar billede arne_v Ekspert
25. juli 2003 - 23:31 #2
Men hvis du omorganiserede således at der altid kun var
en enkelt record per IP nummer, så kunne du:

UPDATE online SET time = now() WHERE IPnr = xxx

og hvis den fejlede (fordi IPnr ikke var der) så:

INSERT INTO online (IPnr, time) VALUES (xxx, now())
Avatar billede webcreator Nybegynder
25. juli 2003 - 23:33 #3
Tror jeg også jeg gør. Så må jeg bare have en anden tabel, der tæller totale antal besøg. Dog lidt træls, med en hel tabel til sølle et felt :)
Avatar billede arne_v Ekspert
25. juli 2003 - 23:36 #4
Ikke nødvendigt.

UPDATE online SET time = now(), antal = antal + 1 WHERE IPnr = xxx

og hvis den fejlede (fordi IPnr ikke var der) så:

INSERT INTO online (IPnr, time, antal) VALUES (xxx, now(), 1)
Avatar billede webcreator Nybegynder
26. juli 2003 - 00:07 #5
Kan man da lave et tjek på, om den fejlede ? Eller er det nødvendigt, at tjekke vha. PHP, om IPen allerede er der ?
Avatar billede webcreator Nybegynder
26. juli 2003 - 00:07 #6
Man kan måske skrive :

if (mysql_error()) ?
Avatar billede webcreator Nybegynder
26. juli 2003 - 00:15 #7
Lavede or die(mysql_error());  om til or $error = true; - så kan jeg bruge en if :-)
Avatar billede webcreator Nybegynder
26. juli 2003 - 00:22 #8
Duer heller ikke. Man får jo ikke en fejl, bare fordi den ikke indsætter noget (fx. hvis WHERE ikke er opfyldt). Kan dette løses ? Således at der meldes fejl, hvis der intet opdateres ?
Avatar billede repsac Nybegynder
26. juli 2003 - 00:29 #9
"Dog lidt træls, med en hel tabel til sølle et felt :)"
Hm, jeg vil mene der skal være hele tre rækker: id (int(nok), primary key, not null, auto_increment), ip (int([nok til IPv6]), not null), antal (int(nok), not null)

... og ellers noget i stil med:
if (@mysql_query("UPDATE online SET time = now() WHERE IPnr = xxx")) {
    # Hurra, det blev indsat
} else if (@mysql_query("INSERT ...")) {
    # Nåda, så kom ip'en da i db'en nu...
} else {
    # Noget er _helt_ galt!
}
Avatar billede repsac Nybegynder
26. juli 2003 - 00:30 #10
pis
Plejer at holde det meget stringent; at bruge STORE bogstaver til SQL-kommandoer, men det kan jo smutte når man C&P'er for meget :)
- now() skulle naturligvis have været NOW() :)
Avatar billede webcreator Nybegynder
26. juli 2003 - 00:35 #11
Jeg har lige afsat hele 5 points mere, i håb om, at I kan fortælle mig om en SQL kommando, der sammenlægger tal i et felt.

Strengen skal tage tallene i alle poster under feltet "antal", og summere disse
Avatar billede repsac Nybegynder
26. juli 2003 - 00:40 #12
SUM(feltnavn) ?
Avatar billede webcreator Nybegynder
26. juli 2003 - 00:49 #13
sådan :
$besoeg = mysql_query("SELECT SUM(antal) from online");  ?
Avatar billede webcreator Nybegynder
26. juli 2003 - 01:09 #14
Jo, det virkede sørme.

Arne > Tror ikke jeg helt brugte din løsning - men jeg fik et par gode ideer, så du får de 15 points.

Repsac > Smid du også et svar, så du kan få for SUM kommandoen.

Tak for hjælpen.
Avatar billede arne_v Ekspert
26. juli 2003 - 09:21 #15
svar
Avatar billede arne_v Ekspert
26. juli 2003 - 10:39 #16
Det er rigtigt at UPDATE ikke laver en exception ved ingen matchende rows.

Men normalt kan man spørge om hvor mange rows der er processet.

Hvis man kan det i PHP, så kan du også bruge testet.
Avatar billede repsac Nybegynder
26. juli 2003 - 18:55 #17
ok
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
Computerworld tilbyder specialiserede kurser i database-management

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