表jilu设计
id,
sid,
tn,值ding,unti,not
date,格式2009-08-15 DATE
total,同sid,同tn,同date的数目
里面的数据
id,sid,tn,date,total
10,1,ding,2009-08-12,20
20,22,unti,2008-02-10
假如在表中存在sid=10 并且date=2009-05-10 并且tn的值等于ding的,那么就将该id的total的值自动加一,如果没有符合这样的条件的,那么就insert新的记录,记录的sid=10,date=今日的值,tn等于ding,total等于1
这样的SQL语句如何写啊?
我这几天都是弄这个jilu表的统计的,希望大家帮我。
8 个解决方案
#1
replace into..语句可以实现。
只是要求你的表里要有主键。
只是要求你的表里要有主键。
#2
能够写详细点吗?
表jilu中的主键是id
表jilu中的主键是id
#3
你可以参考一下 insert into .... ON DUPLICATE KEY UPDATE ...
MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html
MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html
#4
官方手册中的例子
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
设置你的这个表 jilu 中 sid,date 为复合的unique 索引。
然后
insert into jilu values (xx,xxx,xxx,xx) on duplicate key update total=total+1
另外建议不要用 date 这种保留字 做为字段名。
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
设置你的这个表 jilu 中 sid,date 为复合的unique 索引。
然后
insert into jilu values (xx,xxx,xxx,xx) on duplicate key update total=total+1
另外建议不要用 date 这种保留字 做为字段名。
#5
楼上的方法不错,没用过,存储过程可以实现。
DELIMITER //
DROP PROCEDURE IF EXISTS sp_insert_update
//
CREATE PROCEDURE sp_insert_update(in vsid int,in vtn varchar(20),in vdate date)
BEGIN
DECLARE num int DEFAULT 0;
DECLARE vid int DEFAULT 0;
SELECT count(*),jl.id INTO num,vid FROM jilu jl WHERE EXISTS (
SELECT 1 FROM jilu j WHERE j.sid=vsid AND j.tn=vtn AND j.date=vdate)
GROUP BY jl.id LIMIT 1;
IF num=0 THEN
INSERT INTO jilu VALUES (null,vsid,vtn,vdate,1);
ELSE
UPDATE jilu SET total=total+1 WHERE id=vid;
END IF;
END;
//
#6
或者用触发器,用楼上的方法进行判断
#7
两条SQL就行了:
UPDATE jilu SET total = total + 1
WHERE sid = 10 AND `date` = '2009-05-10' AND tn = 'ding';
INSERT INTO jilu (sid, `date`, tn, total)
SELECT 10, CURDATE(), 'ding', 1
FROM jilu
WHERE ROW_COUNT() = 0;
#8
好样的,学习了
#1
replace into..语句可以实现。
只是要求你的表里要有主键。
只是要求你的表里要有主键。
#2
能够写详细点吗?
表jilu中的主键是id
表jilu中的主键是id
#3
你可以参考一下 insert into .... ON DUPLICATE KEY UPDATE ...
MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html
MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html
#4
官方手册中的例子
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
设置你的这个表 jilu 中 sid,date 为复合的unique 索引。
然后
insert into jilu values (xx,xxx,xxx,xx) on duplicate key update total=total+1
另外建议不要用 date 这种保留字 做为字段名。
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
设置你的这个表 jilu 中 sid,date 为复合的unique 索引。
然后
insert into jilu values (xx,xxx,xxx,xx) on duplicate key update total=total+1
另外建议不要用 date 这种保留字 做为字段名。
#5
楼上的方法不错,没用过,存储过程可以实现。
DELIMITER //
DROP PROCEDURE IF EXISTS sp_insert_update
//
CREATE PROCEDURE sp_insert_update(in vsid int,in vtn varchar(20),in vdate date)
BEGIN
DECLARE num int DEFAULT 0;
DECLARE vid int DEFAULT 0;
SELECT count(*),jl.id INTO num,vid FROM jilu jl WHERE EXISTS (
SELECT 1 FROM jilu j WHERE j.sid=vsid AND j.tn=vtn AND j.date=vdate)
GROUP BY jl.id LIMIT 1;
IF num=0 THEN
INSERT INTO jilu VALUES (null,vsid,vtn,vdate,1);
ELSE
UPDATE jilu SET total=total+1 WHERE id=vid;
END IF;
END;
//
#6
或者用触发器,用楼上的方法进行判断
#7
两条SQL就行了:
UPDATE jilu SET total = total + 1
WHERE sid = 10 AND `date` = '2009-05-10' AND tn = 'ding';
INSERT INTO jilu (sid, `date`, tn, total)
SELECT 10, CURDATE(), 'ding', 1
FROM jilu
WHERE ROW_COUNT() = 0;
#8
好样的,学习了