Autor | Zpráva | ||
---|---|---|---|
bubbuub Profil * |
#1 · Zasláno: 28. 2. 2008, 23:46:52
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 * |
#2 · Zasláno: 28. 2. 2008, 23:49:08
|
||
Kajman_ Profil * |
#3 · Zasláno: 29. 2. 2008, 09:02:32
|
||
bubbuub Profil * |
#4 · Zasláno: 29. 2. 2008, 12:46:54
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 * |
#5 · Zasláno: 29. 2. 2008, 14:04:19
Musíte mít primární klíč (id,ip).
|
||
bubbuub Profil * |
#6 · Zasláno: 29. 2. 2008, 15:07:17
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 * |
#7 · Zasláno: 29. 2. 2008, 15:11:55
Právě. Dáte společný index na kombinaci id a ip. Jeden klíč bude obsahovat oba sloupečky.
|
||
bubbuub Profil * |
#8 · Zasláno: 29. 2. 2008, 20:29:33
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 `pocet` = `pocet`+1 -->> Ak riadok existuje ale nevyhovuje tej podmienke UNIX_TIMESTAMP() - `cas` >= 86400 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 * |
#10 · Zasláno: 29. 2. 2008, 22:12:23
á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))."'"); |
||
Časová prodleva: 16 let
|
0