mysql根据星期进行的复杂筛选 有一个表专门记录了ID、人名、上班日期,现要求得每周符合:周一至周五只休息一天,同时周六周日只休息一天的人员名单,写出 mysql 的 sql 语句。没有方向,请高手帮助。谢谢。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 更新一下:员工单独一个表:ID、工号、姓名;考勤单独一个表:ID、日期、考勤。要求要得到考勤“正常”、日期范围为指定的某一周。 人员表--------------|ID|code|name|==============| 1|1001|小王|--------------| 2|1002|小李|--------------考勤表--------------------------|ID|user| date |atten|==========================| 1| 1|2009-11-10| 正常|--------------------------| 2| 2|2009-11-10| 正常|--------------------------| 3| 1|2009-11-11| 正常|--------------------------| ....... |--------------------------|15| 1|2009-11-25| 正常|--------------------------(不是每个人都有考勤,有些人是没有考勤信息的)求my-sql语句:16号(周一)~20号(周五)只休息一天(没有考勤)的人 and 21号(周六)~22号(周日)只休息一天(没有考勤)的人的工号和姓名。 |ID|code|name|==============| 1|1001|小王|| 2|1002|小李||ID|user| date |atten|==========================| 1| 1|2009-11-10| 正常|--------------------------| 2| 2|2009-11-10| 正常|--------------------------| 3| 1|2009-11-11| 正常|--------------------------|15| 1|2009-11-25| 正常|--------------------------如果按以上建表,并使用这些数据,那么你期望的正确结果是什么?建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。给出你的 create table 语句insert into 语句以及最重要的,正确的结果是什么样的?当您的问题得到解答后请及时结贴.http://topic.csdn.net/u/20090501/15/7548d251-aec2-4975-a9bf-ca09a5551ba5.html CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL auto_increment, `code` char(6) NOT NULL COMMENT '工号', `name` char(8) NOT NULL COMMENT '姓名', PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;INSERT INTO `user` (`code`, `name`) VALUES('1001', '小李'),('1002', '小王');-----------------------------------------------------CREATE TABLE IF NOT EXISTS `atten` ( `id` int(11) NOT NULL auto_increment, `user` int(11) NOT NULL, `date` date NOT NULL, `atten` char(6) NOT NULL, PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;INSERT INTO `atten` (`user`, `date`, `atten`) VALUES(1, '2009-11-10', '正常'),(2, '2009-11-10', '正常'),(1, '2009-11-11', '正常'),(2, '2009-11-11', '正常'),(1, '2009-11-12', '正常'),(1, '2009-11-13', '正常'),(2, '2009-11-14', '正常'),(1, '2009-11-15', '正常'),(1, '2009-11-16', '正常'),(1, '2009-11-17', '正常'),(1, '2009-11-18', '正常');------------------------------------------------我要得到:2009-11-10~2009-11-18只有一天休息的人的名单(即小李) 2009-11-10~2009-11-18 这个和你在顶楼所谓的 "根据星期" 好象很难去理解。下面是基于你 #7楼 的说明写的。我要得到:2009-11-10~2009-11-18只有一天休息的人的名单(即小李)2009-11-10~2009-11-18 一共九天,mysql> select * from user;+----+------+------+| id | code | name |+----+------+------+| 1 | 1001 | 小李 || 2 | 1002 | 小王 |+----+------+------+2 rows in set (0.00 sec)mysql> select * from atten;+----+------+------------+-------+| id | user | date | atten |+----+------+------------+-------+| 1 | 1 | 2009-11-10 | 正常 || 2 | 2 | 2009-11-10 | 正常 || 3 | 1 | 2009-11-11 | 正常 || 4 | 2 | 2009-11-11 | 正常 || 5 | 1 | 2009-11-12 | 正常 || 6 | 1 | 2009-11-13 | 正常 || 7 | 2 | 2009-11-14 | 正常 || 8 | 1 | 2009-11-15 | 正常 || 9 | 1 | 2009-11-16 | 正常 || 10 | 1 | 2009-11-17 | 正常 || 11 | 1 | 2009-11-18 | 正常 |+----+------+------------+-------+11 rows in set (0.00 sec)mysql> select u.id,u.name -> from user u inner join atten a on u.id=a.user -> where a.date between '2009-11-10' and '2009-11-18' -> group by u.id,u.name -> having count(*)=8;+----+------+| id | name |+----+------+| 1 | 小李 |+----+------+1 row in set (0.00 sec)mysql> 显示你的 show create table user;show create table atten;select * from user;select * from atten;希望你楼上提供的测试数据和你自己的数据是一致的。不要你自己用一套,然后提供给别人另一套。这种测试还有什么意义? 求高手看看这个外键问题 select 重要语句2 mysql建表不成功~ mysql 如何在insert语句中插入上一个成功insert的id? mysql按回车后怎么返回上一行 数据库冲突? 一个1G多的sql文件用什么编辑软件可以打得开? ERROR 1136 (21S01): Column count doesn't match value count at row 1 MYSQL写入或者读取速度慢 怎么解决呢 是固态硬盘。 有偿请教-mysql数据恢复的问题 powerdesigner如何定义表的用户定义完整性(check) col like 后面可以 写字段吗,怎么写?
考勤单独一个表:ID、日期、考勤。要求要得到考勤“正常”、日期范围为指定的某一周。
--------------
|ID|code|name|
==============
| 1|1001|小王|
--------------
| 2|1002|小李|
--------------考勤表
--------------------------
|ID|user| date |atten|
==========================
| 1| 1|2009-11-10| 正常|
--------------------------
| 2| 2|2009-11-10| 正常|
--------------------------
| 3| 1|2009-11-11| 正常|
--------------------------
| ....... |
--------------------------
|15| 1|2009-11-25| 正常|
--------------------------
(不是每个人都有考勤,有些人是没有考勤信息的)求my-sql语句:16号(周一)~20号(周五)只休息一天(没有考勤)的人 and 21号(周六)~22号(周日)只休息一天(没有考勤)的人的工号和姓名。
==============
| 1|1001|小王|
| 2|1002|小李||ID|user| date |atten|
==========================
| 1| 1|2009-11-10| 正常|
--------------------------
| 2| 2|2009-11-10| 正常|
--------------------------
| 3| 1|2009-11-11| 正常|
--------------------------
|15| 1|2009-11-25| 正常|
--------------------------
如果按以上建表,并使用这些数据,那么你期望的正确结果是什么?建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。给出你的 create table 语句
insert into 语句以及最重要的,正确的结果是什么样的?当您的问题得到解答后请及时结贴.
http://topic.csdn.net/u/20090501/15/7548d251-aec2-4975-a9bf-ca09a5551ba5.html
`id` int(11) NOT NULL auto_increment,
`code` char(6) NOT NULL COMMENT '工号',
`name` char(8) NOT NULL COMMENT '姓名',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;INSERT INTO `user` (`code`, `name`) VALUES
('1001', '小李'),
('1002', '小王');-----------------------------------------------------CREATE TABLE IF NOT EXISTS `atten` (
`id` int(11) NOT NULL auto_increment,
`user` int(11) NOT NULL,
`date` date NOT NULL,
`atten` char(6) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;INSERT INTO `atten` (`user`, `date`, `atten`) VALUES
(1, '2009-11-10', '正常'),
(2, '2009-11-10', '正常'),
(1, '2009-11-11', '正常'),
(2, '2009-11-11', '正常'),
(1, '2009-11-12', '正常'),
(1, '2009-11-13', '正常'),
(2, '2009-11-14', '正常'),
(1, '2009-11-15', '正常'),
(1, '2009-11-16', '正常'),
(1, '2009-11-17', '正常'),
(1, '2009-11-18', '正常');------------------------------------------------我要得到:2009-11-10~2009-11-18只有一天休息的人的名单(即小李)
2009-11-10~2009-11-18 一共九天,mysql> select * from user;
+----+------+------+
| id | code | name |
+----+------+------+
| 1 | 1001 | 小李 |
| 2 | 1002 | 小王 |
+----+------+------+
2 rows in set (0.00 sec)mysql> select * from atten;
+----+------+------------+-------+
| id | user | date | atten |
+----+------+------------+-------+
| 1 | 1 | 2009-11-10 | 正常 |
| 2 | 2 | 2009-11-10 | 正常 |
| 3 | 1 | 2009-11-11 | 正常 |
| 4 | 2 | 2009-11-11 | 正常 |
| 5 | 1 | 2009-11-12 | 正常 |
| 6 | 1 | 2009-11-13 | 正常 |
| 7 | 2 | 2009-11-14 | 正常 |
| 8 | 1 | 2009-11-15 | 正常 |
| 9 | 1 | 2009-11-16 | 正常 |
| 10 | 1 | 2009-11-17 | 正常 |
| 11 | 1 | 2009-11-18 | 正常 |
+----+------+------------+-------+
11 rows in set (0.00 sec)mysql> select u.id,u.name
-> from user u inner join atten a on u.id=a.user
-> where a.date between '2009-11-10' and '2009-11-18'
-> group by u.id,u.name
-> having count(*)=8;
+----+------+
| id | name |
+----+------+
| 1 | 小李 |
+----+------+
1 row in set (0.00 sec)mysql>
show create table user;
show create table atten;
select * from user;
select * from atten;希望你楼上提供的测试数据和你自己的数据是一致的。不要你自己用一套,然后提供给别人另一套。这种测试还有什么意义?