2009-05-09 4 views
5

У меня есть простая таблица, как показано ниже.PHP MYSQL Вставка/обновление

CREATE TABLE `stats` (
    `id` int(11) NOT NULL auto_increment, 
    `zones` varchar(100) default NULL, 
    `date` date default NULL, 
    `hits` int(100) default NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1; 

Так что просто хранить счетчик обращений к каждой зоне в день.

Но я просто хочу увеличить значение хитов за тот же день.

Я пробовал MYSQL DUPLICATE KEY UPDATE, но это не будет работать, поскольку у меня может быть много зон в разные даты, поэтому я не могу сделать их уникальными или датами.

Таким образом, единственный способ, которым я могу думать, первое, чтобы сделать запрос, чтобы увидеть, если существует дата то не простой, если() для вставки/обновления

Является ли их лучший способ сделать такую ​​задачу, как там может быть, много 1000 хитов в день.

Надеюсь, что это имеет смысл :-).

И спасибо, если вы можете посоветовать.

ответ

7

Объявите кортеж (zone, date) как уникальный в инструкции CREATE. Это приведет к тому, что INSERT ... ON DUPLICATE UPDATE будет работать как ожидалось:

CREATE TABLE `stats` (
    `id` int(11) NOT NULL auto_increment, 
    `zone` varchar(100) default NULL, 
    `date` date default NULL, 
    `hits` int(100) default NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE (`zone`, `date`) 
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1; 

INSERT INTO stats (zone, date, hits) values ('zone1', 'date1', 1) ON DUPLICATE KEY UPDATE hits = hits + 1; 
+1

Я действительно говорил, что пытался использовать DUPLICATE KEY UPDATE, и он не будет работать, потому что зона и дата не могут быть уникальными. Пример: зона будет иметь несколько дней, т. Е. зона - дата - хиты zone1 - 2009-05-11 - 100 Zone2 - 2009-05-11 - 55 zone1 - 2009-05-10 - 120 Zone2 - 2009-05-10 - 88 См. Ig. У меня была дата или зона uniqe. У меня было бы всего 2 записи из приведенного выше примера. :-( – Lee

+0

UNIQUE (зона, дата) гарантирует, что зона и дата уникальны * вместе *. Прекрасно иметь несколько записей с той же зоной, если даты разные. То же самое относится к нескольким записям с в то же время и в разных зонах. Но не должно быть двух записей с одной и той же датой * и *. Я думаю, это соответствует вашим требованиям. Попробуйте в тестовой базе данных и посмотрите, не работает ли она. –

+0

Повторите попытку Аймана. я имел все тоже, что вы были выше, но плохо попробуйте теперь снова. – Lee

1
$result = mysql_query("SELECT id FROM stats WHERE zone=$zone AND date=$today LIMIT 1"); 
if(mysql_num_rows($result)) { 
    $id = mysql_result($result,0); 
    mysql_query("UPDATE stats SET hits=hits+1 WHERE id=$id"); 
} else { 
    mysql_query("INSERT INTO stats (zone, date, hits) VALUES ($zone, $today, 1)"); 
} 

Что-то вроде этого, если я правильно вас истолковал ... это совершенно непроверено. Вы можете понять, что такое переменные.

+1

Это решение имеет потенциальное состояние гонки. –

+0

Затем используйте лучшее решение выше: p Не думал об этом. Хороший звонок;) – mpen

Смежные вопросы