Pozdrav!
Treba mi jedna pomoč oko php i mysql. Imam tablicu u koji je: ime, datum, ip, status
E sad mi treba jedna skripta, koja potraži prvi ip i pronađe sve unose ovog ip-ja. Do ovdje nema problema. Problem se pojavi, kako promjeniti status svima unosima ovog ip-ja, ako so u razponu manje od 24 sati. Ostavi se samo jedan unos.
Ovako bi mi trebalo za sve ip-je, koji su u bazi, da ne tražim ručno.
Citat: erbi u 01. Rujan 2014, 09:41
Pozdrav!
Treba mi jedna pomoč oko php i mysql. Imam tablicu u koji je: ime, datum, ip, status
E sad mi treba jedna skripta, koja potraži prvi ip i pronađe sve unose ovog ip-ja. Do ovdje nema problema. Problem se pojavi, kako promjeniti status svima unosima ovog ip-ja, ako so u razponu manje od 24 sati. Ostavi se samo jedan unos.
Ovako bi mi trebalo za sve ip-je, koji su u bazi, da ne tražim ručno.
Ovako iz glave, mislim da bi ovak nešto trebalo proći, samo treba imena tablica (i filed-ova) zamjenit....
DELETE test
FROM test
INNER JOIN (
SELECT MAX(ip) AS lastIp, ime, datum
FROM test
GROUP BY ip
HAVING COUNT(*) > 1
) duplicate ON duplicate.lastIp = test.ip
WHERE test.datum < duplic.datum;
Prvo svakako backup, a za testiranje možeš u prvoj liniji umjesto "DELETE" napisati "SELECT" i trebao bi ti izbaciti van sve zapise koje bi inače izbrisao... Ako ti izbaci van redove koji su dupli, a nisu najnovij, onda je to - to
Problem bi mogao biti što nema id-a u tablici.... A još jedan način na koji bi mogao to izbjeći je da staviš da je IP adresa Unique u tablici i onda u INSERT statementu napraviš ON DUPLICATE KEY UPDATE, odnosno ako taj key već postoji - update-aš samo datum. Na taj ničin nikad u stvari nebi imao duplikate već samo jedinstvene IP adrese, a više o tome na
http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
Hvala Dario.
Tablica ima i ID, pa mi ne koristi suviše :) Ip ne mogu biti unique, jer se svaki dan jedanput može upisat isti ip. U skripti ima, da kontroliše ip i vrijeme upisa. Kod mene radi, al neko je zaobišao i stavio puno zapisa u 10 sekundi. Zaobišao je i cookie iako je ovaj obavezan.
Evo, u tablici je ovako:
id datum ip
"15813","2014-09-01 12:00:00","666"
"15810","2014-09-02 02:00:00","666"
"15811","2014-09-02 04:00:00","666"
"15812","2014-09-02 06:00:00","666"
"15814","2014-09-03 12:00:00","666"
"15815","2014-09-03 14:00:00","666"
Delete bi morao obrisati linije 3, 4, 6, al mi obriše linije 2, 3, 4. Znači, svaki dan je možan samo jedan upis od jednog IP-ja. Noje bitno, dali je to prvi ili poslednji.
Koda je ovakva:
$result = mysqli_query($con,"SELECT *
FROM votes
INNER JOIN (
SELECT MAX(ip) AS lastIp, option_id, date
FROM votes
GROUP BY ip
HAVING COUNT(*) > 1
) duplicate ON duplicate.lastIp = votes.ip
where DATE_FORMAT(DATE(votes.date), '%Y-%m-%d') = DATE_FORMAT(DATE(duplicate.date), '%Y-%m-%d')");
Probaj u ovom queryiju liniju "GROUP BY ip" zamjenit sa "GROUP BY ip, date", mislim da bi to trebalo bit to
E, ovo radi kako treba. Ima još jednu manju grešku.
Ako pronađe 2 ili više IP-ja na jedan dan obriše sve za toj dan. Neče da ostavi jednog. Ako0 ne ide, može i ovako.
Još sada ne shvačam, kako je moguče zaobiči kontrolu IP-ja? Sa klikom sve se upiše u tablicu. Sa poslednjim posjetom se prvo provjeri dali danas več postoji ovaj ip. Ako postoji forma se ne pokazuje, a ja imam upise po 5 na isti sekund.
Citat: erbi u 03. Rujan 2014, 09:45
E, ovo radi kako treba. Ima još jednu manju grešku.
Ako pronađe 2 ili više IP-ja na jedan dan obriše sve za toj dan. Neče da ostavi jednog. Ako0 ne ide, može i ovako.
Mislam da ovaj "=" znak na kraju u WHERE-u treba promjeniti u "<" i to bi trebalo bit to....
Evo, ovakvo je rješenje:
$result = mysqli_query($con,"SELECT *
FROM xlpix_acepolls_votes
INNER JOIN (
SELECT MAX(ip) AS lastIp, option_id, date, MAX(id) as maxId
FROM votes
GROUP BY ip, DATE_FORMAT(DATE(votes.date), '%Y-%m-%d')
HAVING COUNT(*) > 1
) duplicate ON duplicate.lastIp = votes.ip
where DATE_FORMAT(DATE(votes.date), '%Y-%m-%d') = DATE_FORMAT(DATE(duplicate.date), '%Y-%m-%d')
AND maxId > votes.id");
Dario hvala na pomoči!
No frk, zato smo tu :)