>我有一个包含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
.
我可以使用两个语句。我怎样才能做到这一点?
将ip
更改为 UNSIGNED 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 地址。
你需要从选择开始。(一个伪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>...);