Autor Zpráva
bubbuub
Profil *
Zdravím,
šlo by nejako spraviť aby sa updatoval riadok v mysql ak sa tam nachádza, a ak sa nenachádza tak by sa vytvoril? Momentálne používam riešenie na 3 mysql príkazy, ale chcel by som to vtesnať do jedného ;-)

Tu som našiel riešenie pre MsSQL. Našlo by sa nejaké aj pre MySQL?
http://blogs.msdn.com/miah/archive/2008/02/17/sql-if-exists-update-els e-insert.aspx


Toto keby fungovalo v mysql tak by to bolo ideálne ;-)
UPDATE Table1 SET (...) WHERE Column1='SomeValue'
IF @@ROWCOUNT=0
    INSERT INTO Table1 VALUES (...)
K
Profil *
http://dev.mysql.com/doc/refman/5.0/en/replace.html
Kajman_
Profil *
Spíše
http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
bubbuub
Profil *
Asi som lama ale ON DUPLICATE KEY mi ani za nič nechce fungovať :-/ V manuáli sa píše niečo, že tam musí byť nastavená pre niektoré stĺpce UNIQUE. To však nastavené nemám, je to potrebné?

Kajman_ >> vedel by si nejaký konkrétny príklad? Potreboval by som dať do jedného SQL príkazu toto:

[code]
if (mysql_result(mysql_query("SELECT COUNT(`id`) FROM `pocitadla_online` WHERE `id` = '".m($_GET['id'])."' AND `ip` = '".$_SERVER['REMOTE_ADDR']."'"),0) >= 1) {
mysql_query("UPDATE `pocitadla_online` SET `cas` = '".time()."' WHERE `id` = '".m($_GET['id'])."' AND `ip` = '".$_SERVER['REMOTE_ADDR']."'");
}
else {
mysql_query("INSERT INTO `pocitadla_online` VALUES('".m($_GET['id'])."','".time()."','".$_SERVER['REMOTE_ADDR']."' )");
}
[/code]
Kajman_
Profil *
Musíte mít primární klíč (id,ip).
bubbuub
Profil *
A bez PRIMARY KEY by to nešlo? Pretože nemám tám žiadnu unikátnu hodnotu. Rovnaké ID tam bude viac krát a takisto aj IP adresa tam môže byť viac krát rovnaká. Jedine IP+ID spolu tam nebudú asi nikdy rovnaké. Plánujem okolo 500 vymazaní za minútu takže auto_increment alebo niečo podobné by nebolo možné. Vedeli by ste nejaké riešenie ako na to?

Vďaka
Kajman_
Profil *
Právě. Dáte společný index na kombinaci id a ip. Jeden klíč bude obsahovat oba sloupečky.
bubbuub
Profil *
Ok super ;-) Funguje to....

A ešte mám jeden problém ktorý by sa mal asi tiež riešiť cez toto ON DUPLICATE KEY...

-->> Potreboval by som pridať nový riadok ak ešte neexistuje riadok s danou IP a ID.
-->> Ak existuje a hodnota
UNIX_TIMESTAMP() - `cas` >=  86400
tak by sa v riadku zvýšila hodnota `pocet` o 1 (
`pocet` = `pocet`+1
).
-->> Ak riadok existuje ale nevyhovuje tej podmienke
UNIX_TIMESTAMP() - `cas` >=  86400
tak by sa to proste ignorovalo a nerobil sa s tým nič.

Dúfam, že som to napísal zrozumiteľne ;-). Prikladám ešte PHP+MySQL kód, ktorý by som chcel zredukovať na jedno mysql_query.

// výber hodnôt z tabuľky pocitadla_uip
$resd = mysql_query("SELECT * FROM `pocitadla_uip` WHERE `id` = '".m($_GET['id'])."' AND `ip` = '".$_SERVER['REMOTE_ADDR']."'");
if (mysql_num_rows($resd) >= 1) {
  $rowd = mysql_fetch_array($resd);
  if (time()-$rowd['cas'] >= 86400) {
    // ak vyhovuje podmienke tak updatuj
    mysql_query("UPDATE `pocitadla_uip` SET `cas` = '".time()."', `pocet` = `pocet` + 1 WHERE `id` = '".m($_GET['id'])."' AND `ip` = '".$_SERVER['REMOTE_ADDR']."'");
  }
  // ak nevyhovuje podmienke tak nerob nič
}
else {
  // ak nebol nájdený žiadny riadok tak vytvor nový
  mysql_query("INSERT INTO `pocitadla_uip` VALUES ('".m($_GET['id'])."','1','".time()."','".$_SERVER['REMOTE_ADDR']."')");
}



Bol by som moc vďačný ak by niekto vedel poradiť ako na to. ;-) Vďaka.
Kajman_
Profil *
V to update po duplikátním klíči dáte podmínku, že to musí být zastaralý čas.

mysql_query("UPDATE `pocitadla_uip` SET `cas` = '".time()."', `pocet` = `pocet` + 1 WHERE `id` = '".m($_GET['id'])."' AND `ip` = '".$_SERVER['REMOTE_ADDR']."' and `cas`<'".(time()-86400)."'");
bubbuub
Profil *
áno, to by šlo dať ta podmienka aj rovno do toho update, ale ako vyriešiť aby bolo v jednom príkaze tá podmienka, ten update a aj to pridanie nového riadka?
Kajman_
Profil *
mysql_query("INSERT INTO `pocitadla_uip` VALUES ('".m($_GET['id'])."','1','".time()."','".$_SERVER['REMOTE_ADDR']."')
on duplicate key
update cas=if(`cas<'".(time()-86400))."','".(time()."',cas), pocet=pocet+(`cas<'".(time()-86400))."'");

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: