MySQL用PHP递增int

时间:2014-05-02 11:34:59

标签: php mysql sql database apache

我是PHP和mysql的新手,所以这可能是一个容易回答的问题。

我正在拍摄"图像A与图像B" site(只是这样我可以学习一些PHP + mysql概念)。

屏幕上会加载两张图片,点击您最喜欢的图片。如果您点击图片A,它会将+1添加到其评级中,而图片B会将+ 1添加到其评级中。我希望正面投票和反对投票是分开的,这就是为什么我不能只使用一个价值。

表格如下;

 imageID | votesUP | votesDOWN
 X54vb   |     1   |   0     
 pe9D3   |     0   |   1     

如果图片X54vb违反了图片pe9D3并赢了,那么该表就像上面的例子一样。

我想创建一个查询来增加值(如果它不存在则创建条目)。

$voteup是此示例中的图片ID;

REPLACE INTO images SET votesUP = votesUP + 1, imageID = '" . $voteup . "';

如果条目不存在,则创建条目,但如果条目不存在则不增加条目。该值始终为1。

我也试过了;

UPDATE images SET votesUP = votesUP + 1 WHERE imageID = '" . $voteup . "';

这会增加该值,但如果不存在,则不会创建该条目。当匹配$voteup的条目尚未创建时,似乎没有任何事情发生。

所以,基本上,我希望只有一个查询可以创建一个条目(如果它不存在),如果它存在则递增它。

我宁愿不尝试从条目中读取以确认它是否存在,然后创建一个条目(如果它不是,然后递增它)。如果可能的话,我想要一个有效的单一查询。

这是我创建的表格;

CREATE TABLE images
(
imageID CHAR(15),
votesUP INT DEFAULT 0,
votesDOWN INT DEFAULT 0,
PRIMARY KEY (imageID)
)"

另外,REPLACE INTOUPDATE之间究竟有什么区别?

感谢。

3 个答案:

答案 0 :(得分:0)

你需要的是使用INSERT ... ON DUPLICATE KEY UPDATE ...我认为这就是你所需要的。

INSERT INTO images ( imageID, votesUP ) values
     ( '" . $voteup . "', 1 )
  ON DUPLICATE KEY UPDATE votesUP=votesUP+1;

但这只是增量,减量将是另一种方式

INSERT INTO images ( imageID, votesDOWN ) values
     ( '" . $voteup . "', 1 )
  ON DUPLICATE KEY UPDATE votesDOWN=votesDOWN+1;

以下是文档INSERT ... ON DUPLICATE KEY UPDATE Syntax

答案 1 :(得分:0)

如果记录不存在,则REPLACE INTO执行INSERT,或者当记录存在时替换它。您不能使用之前的值(x = x + 1),因为它会替换它。它通常只用于导入脚本和那种丑陋的东西。在大多数情况下,您希望使用UPDATE。

如您所述,如果记录尚不存在,则无法更新。所以你应该首先检查它是否存在,如果它还不存在则插入它。另一种方法是尝试UPDATE,查看受影响的行(返回),然后INSERT 0受影响的行。第一种解决方案是更常见的解决方案。在这两种情况下,您必须分两步完成。

我对您的数据模型有一些评论(如果您不介意的话):

  1. 尝试将用户的INT用于id,而不是CHAR。 CHAR将始终分配一定数量的字节(在您的情况下为15),这对于主键来说非常大。它会影响性能。
  2. 您的数据模型对于“图像与图像”系统似乎不太合乎逻辑。在两个图像之间建立链接会更有意义。例如,你有一个实际图像(id,imageUrl等)的“图像”表,一个“竞争”表,表示2个图像(id,视图等)和“得分”表之间的竞争。 (id,competitionId,imageId,votesUp,votesDown)。通过这种方式,您可以查询比赛,图像得分和实际比赛中的单独图像得分(比赛为1张图像与1张其他图像)。
  3. 祝你好运。

    编辑:正如Jorge Campos和bjarkig82所说,ON DUPLICATE KEY UPDATE是一个很好的解决方案,可以在一个双步骤中完成此操作

答案 2 :(得分:0)

您是否尝试过: this

在您的情况下,您可以使用:

INSERT INTO images
  (imageID, votesUP,)
  VALUES
  ($voteup, 1)
ON DUPLICATE KEY UPDATE
  votesUP = votesUP + 1;