1

我有一个带有 ips 的表和一个 ip 访问某个页面的次数的计数。如果 ip 存在一行,我想在计数中添加一个,否则使用 ip 创建一行并将计数设置为 1。

我试过

INSERT INTO mytable (ip,count) VALUES ('" + ip + "',1) ON DUPLICATE KEY UPDATE count=count+1;

但是 ip 不是唯一的或主要的,所以它只是不断地创建具有相同 ip 的行。我尝试让 ip 独一无二,但它不会让我这样做。当我尝试创建一个文本列并使其独一无二时,phpmyadmin 说BLOB/TEXT column 'test' used in key specification without a key length

我可以使用两个语句。我怎样才能做到这一点?

4

2 回答 2

6

更改ipUNSIGNED INT,在其上创建一个UNIQUE约束并使用它:

INSERT
INTO    mytable (ip, count)
VALUES  (INET_ATON($ip), 1)
ON DUPLICATE KEY
UPDATE
        count = count + 1

要以点十进制表示法(如192.168.1.1)检索 ip,请使用:

SELECT  INET_NTOA(ip)
FROM    mytable

您还可以创建一个前缀索引:

CREATE UNIQUE INDEX ux_mytaable_ip ON mytable (ip(15))

INT最好使用列来存储 ipv4 地址。

于 2012-04-20T20:54:56.683 回答
0

您需要从选择开始。(一个伪 codish 的答案 - 您需要针对您的特定方言进行调整。)

所以做一个

select count(*) from mytable
where ip = $ip;

如果返回的计数大于 0,则执行

update mytable
set count = count + 1
where ip = $ip

别的

insert into mytable($ip, count, <other fields>...) values (ip, 1, <other values>...);
于 2012-04-20T20:59:54.840 回答