我有一张包含ips的表,以及ip访问某个页面的次数。如果ip存在一行,我想在count中添加一个,否则用ip创建一行并将count设置为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
。
我很好用两个陈述。我怎么能做到这一点?
答案 0 :(得分:6)
将ip
更改为UNSIGNED INT
,在其上创建UNIQUE
约束并使用此权限:
INSERT
INTO mytable (ip, count)
VALUES (INET_ATON($ip), 1)
ON DUPLICATE KEY
UPDATE
count = count + 1
要以点十进制表示法检索ip(如192.168.1.1
),请使用:
SELECT INET_NTOA(ip)
FROM mytable
您也可以创建一个带前缀的索引:
CREATE UNIQUE INDEX ux_mytaable_ip ON mytable (ip(15))
但首选使用INT
列存储ipv4地址。
答案 1 :(得分:0)
你需要从选择开始。 (伪编码答案 - 你需要根据你的特定方言进行调整。)
所以做一个
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>...);