用户表(user)
+---------+-------------+----------------+
| jifeiID | username | yongfuzu |
+---------+-------------+----------------+
| 5 | wsz1 | 用户组一 |
| 5 | wsz2 | 用户组二 |
| 21 | wsz3 | 用户组三 |
| 2 | wsz4 | 用户组四 |
| 3 | wsz5 | 用户组五 |
+---------+-------------+----------------+计费信息表一(info):+-----------+---------------------+-----------+
| username | infoTime | infoMoney |
+-----------+---------------------+-----------+
| wsz5 | 2009-06-28 01:06:48 | 2.00 |
| wsz1 | 2009-07-27 23:06:54 | 3.00 |
| wsz5 | 2009-06-28 03:25:39 | 4.00 |
| wsz1 | 2009-04-27 22:53:02 | 5.08 |
| wsz4 | 2009-06-27 16:50:15 | 1.00 |
+-----------+---------------------+-----------+
请费信息表二(info2):+-----------+---------+------------+------------+
| username | jifeiID | info2Time | info2Money |
+-----------+---------+------------+------------+
| wsz1 | 1 | 2009-06-01 | 6.00 |
| wsz2 | 5 | 2009-08-01 | 10.00 |
| wsz4 | 2 | 2009-07-01 | 1.00 |
| wsz1 | 21| 2009-02-01 | 20.00 |
| wsz1 | 2 | 2009-05-01 | 20.00 |
+-----------+---------+------------+------------+计费组表(jifei)
+---------+---------------+
| jifeiID | jifeiName |
+---------+---------------+
| 21 | 计费试一 |
| 5 | 计费试二 |
| 2 | 计费试三 |
| 3 | 计费试四 |
| 1 | 计费试五 |
+---------+---------------+要做这么个搜索:按 jifeiID、按日期(年,月,日)来查出所有的费用,即(infoMoney+info2Money)
例:按月搜索出的结果:
----------------------
时间 费用
2009-06 13.00
2009-07 4.00
2009-08 10.00
.....
-----------------
合计 27.00
+---------+-------------+----------------+
| jifeiID | username | yongfuzu |
+---------+-------------+----------------+
| 5 | wsz1 | 用户组一 |
| 5 | wsz2 | 用户组二 |
| 21 | wsz3 | 用户组三 |
| 2 | wsz4 | 用户组四 |
| 3 | wsz5 | 用户组五 |
+---------+-------------+----------------+计费信息表一(info):+-----------+---------------------+-----------+
| username | infoTime | infoMoney |
+-----------+---------------------+-----------+
| wsz5 | 2009-06-28 01:06:48 | 2.00 |
| wsz1 | 2009-07-27 23:06:54 | 3.00 |
| wsz5 | 2009-06-28 03:25:39 | 4.00 |
| wsz1 | 2009-04-27 22:53:02 | 5.08 |
| wsz4 | 2009-06-27 16:50:15 | 1.00 |
+-----------+---------------------+-----------+
请费信息表二(info2):+-----------+---------+------------+------------+
| username | jifeiID | info2Time | info2Money |
+-----------+---------+------------+------------+
| wsz1 | 1 | 2009-06-01 | 6.00 |
| wsz2 | 5 | 2009-08-01 | 10.00 |
| wsz4 | 2 | 2009-07-01 | 1.00 |
| wsz1 | 21| 2009-02-01 | 20.00 |
| wsz1 | 2 | 2009-05-01 | 20.00 |
+-----------+---------+------------+------------+计费组表(jifei)
+---------+---------------+
| jifeiID | jifeiName |
+---------+---------------+
| 21 | 计费试一 |
| 5 | 计费试二 |
| 2 | 计费试三 |
| 3 | 计费试四 |
| 1 | 计费试五 |
+---------+---------------+要做这么个搜索:按 jifeiID、按日期(年,月,日)来查出所有的费用,即(infoMoney+info2Money)
例:按月搜索出的结果:
----------------------
时间 费用
2009-06 13.00
2009-07 4.00
2009-08 10.00
.....
-----------------
合计 27.00
From(
select DATE_FORMAT(infoTime,'%Y-%m') as `时间` ,infoMoney from info
union all
select date_format(info2Time,'%Y-%m'),info2Money from info
) t
Group By `时间`
select `时间`, sum(infoMoney) as 费用
From(
select DATE_FORMAT(infoTime,'%Y-%m') as `时间` ,infoMoney from info
union all
select date_format(info2Time,'%Y-%m'),info2Money from info2
) t
Group By `时间`
From(
select DATE_FORMAT(infoTime,'%Y-%m') as `timea` ,infoMoney from info
union all
select date_format(info2Time,'%Y-%m'),info2Money from info2
) t
where timea between '2009-07' and '2009-12'
Group By `timea`
还有,如果按计费组ID怎么查:(info2表里有计费组ID,info表里没有计费组ID,只能从USER表里去关联
select * from info a left join `USER` b on a.username=b.username
From(
select DATE_FORMAT(infoTime,'%Y-%m') as `timea`,infoMoney,username as username1 from info
union all
select date_format(info2Time,'%Y-%m'),info2Money,username as username2 from info2
) tLEFT JOIN
(select * from a ) s
ON s.username=t.username1 and s.jifeiID="搜索条件传来的计费ID"LEFT JOIN
(select * from a ) z
ON z.username=t.username2 and z.jifeiID="搜索条件传来的计费ID"where timea between '2009-07' and '2009-12'
Group By `timea`
A表是什么表?
+---------+-------------+----------------+
| jifeiID | username | yongfuzu |
+---------+-------------+----------------+
| 5 | wsz1 | 用户组一 |
| 5 | wsz2 | 用户组二 |
| 21 | wsz3 | 用户组三 |
| 2 | wsz4 | 用户组四 |
| 3 | wsz5 | 用户组五 |
+---------+-------------+----------------+
是这个表,用户表记录的用户属性
select * from user.
FROM(
SELECT DATE_FORMAT(infoTime,'%Y-%m') AS `timea`,infoMoney,username AS username1,'' AS username2 FROM info
UNION ALL
SELECT DATE_FORMAT(info2Time,'%Y-%m'),info2Money,'',username AS username2 FROM info2
) tLEFT JOIN `user` s ON s.username=t.username1 LEFT JOIN `user` z ON z.username=t.username2 WHERE timea BETWEEN '2009-07' AND '2009-12'
GROUP BY `timea`
SELECT `timea`,IF(LENGTH(username1)=0,username2,username1), SUM(infoMoney) AS 费用
FROM(
SELECT DATE_FORMAT(infoTime,'%Y-%m') AS `timea`,infoMoney,username AS username1,'' AS username2 FROM info
UNION ALL
SELECT DATE_FORMAT(info2Time,'%Y-%m'),info2Money,'',username AS username2 FROM info2
) tLEFT JOIN `user` s ON s.username=t.username1 LEFT JOIN `user` z ON z.username=t.username2 WHERE timea BETWEEN '2009-07' AND '2009-12'
GROUP BY `timea`不是标准的SQL语句
LEFT JOIN `user` s ON s.username=t.username1 and s.jifeiID="搜索条件传来的计费ID"LEFT JOIN `user` z ON z.username=t.username2 and z.jifeiID="搜索条件传来的计费ID"这儿我加了个条件,搜出来的值不是正确
USER:
+-----------------+---------------+-----------------+
| username | jifeiID | user_zone_group |
+-----------------+---------------+-----------------+
| a | 1 | student |
| b | 1 | student |
| c | 2 | gonghui |
| d | 2 | gonghui |
| e | 3 | teacher |
+-----------------+---------------+-----------------+
info:
+-----------------+---------------------+-------------+
| username | infoTime | infoMoney |
+-----------------+---------------------+-------------+
| a | 2010-11-01 23:00:00 | 1 |
| b | 2010-11-02 11:00:00 | 2 |
| a | 2010-11-03 23:00:00 | 5 |
+-----------------+---------------------+-------------+info2:
+-----------------+-------------+---------------------+
| username | info2Money | info2Time |
+-----------------+-------------+---------------------+
| a | 2 | 0000-00-00 00:00:00 |
| b | 2 | 2010-11-01 11:00:00 |
| c | 3 | 2010-11-01 09:00:00 |
| d | 2 | 2010-11-02 08:00:00 |
| e | 2 | 2010-11-02 00:00:00 |
+-----------------+-------------+---------------------+搜索当ID=2的时候
+------------+-----------+-----------+------------+
| timea | username1 | username2 | infoMoney |
+------------+-----------+-----------+------------+
| 2010-11-01 | a | | 6 |
| 2010-11-02 | b | | 6 |
+------------+-----------+-----------+------------+
2 rows in set (0.00 sec)
->
-> LEFT JOIN `user` z ON z.username=t.username2 and s.jifeiID='2'
->
-> WHERE t.timea BETWEEN '2010-11-01' AND '2010-11-02'
-> GROUP BY t.timea;
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
# version 2.5.6
# http://www.phpmyadmin.net
#
# 主机: localhost
# 生成日期: 2010 年 11 月 13 日 14:33
# 服务器版本: 5.0.22
# PHP 版本: 5.1.6
#
# 数据库 : `wuszh`
# # --------------------------------------------------------#
# 表的结构 `user`
#CREATE TABLE `user` (
`username` varchar(20) default NULL,
`jifeiID` int(11) default NULL,
`yongfuzu` varchar(20) default NULL,
KEY `username` (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;#
# 导出表中的数据 `user`
#INSERT INTO `user` (`username`, `jifeiID`, `yongfuzu`) VALUES ('a', 1, 'student'),
('b', 1, 'student'),
('c', 2, 'gonghui'),
('d', 2, 'gonghui'),
('e', 3, 'teacher');# --------------------------------------------------------#
# 表的结构 `info2`
#CREATE TABLE `info2` (
`username` varchar(10) default NULL,
`jifeiID` int(11) NOT NULL,
`info2Money` varchar(5) default NULL,
`info2Time` datetime default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;#
# 导出表中的数据 `info2``
#INSERT INTO `info2` (`username`, `jifeiID`, `info2Money`, `info2Time`) VALUES ('a', 1, '2', '2010-11-01 12:00:00'),
('b', 1, '2', '2010-11-01 11:00:00'),
('c', 2, '3', '2010-11-01 09:00:00'),
('d', 2, '2', '2010-11-02 08:00:00'),
('e', 3, '2', '2010-11-02 00:00:00');# --------------------------------------------------------#
# 表的结构 `info`
#CREATE TABLE `info` (
`username` varchar(20) default NULL,
`infoTime` datetime default '0000-00-00 00:00:00',
`infoMoney` varchar(5) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;#
# 导出表中的数据 `info`
#INSERT INTO `info (`username`, `infoTime`, `infoMoney`) VALUES ('a', '2010-11-01 23:00:00', '1'),
('b', '2010-11-02 11:00:00', '2'),
('a', '2010-11-03 23:00:00', '5');
('a', '2010-11-01 23:00:00', '1'),
('b', '2010-11-02 11:00:00', '2'),
('a', '2010-11-03 23:00:00', '5'),
('c', '2010-11-01 23:00:00', '4');------------------
求出当时间为:2010-11-01至2010-11-02的并且jifieID=2的(info和info2)的费用,并合计:日期 费用
2010-11-01 6
2010-11-02 2
----------------------
合计 8
2010-11-01 7
2010-11-02 2
----------------------
合计 9
+----------+---------+----------+
| username | jifeiID | yongfuzu |
+----------+---------+----------+
| a | 1 | student |
| b | 1 | student |
| c | 2 | gonghui |
| d | 2 | gonghui |
| e | 3 | teacher |
+----------+---------+----------+
5 rows in set (0.00 sec)mysql> select * from info;
+----------+---------------------+-----------+
| username | infoTime | infoMoney |
+----------+---------------------+-----------+
| a | 2010-11-01 23:00:00 | 1 |
| b | 2010-11-02 11:00:00 | 2 |
| a | 2010-11-03 23:00:00 | 5 |
| c | 2010-11-01 23:00:00 | 4 |
+----------+---------------------+-----------+
4 rows in set (0.00 sec)mysql> select * from info2;
+----------+---------+------------+---------------------+
| username | jifeiID | info2Money | info2Time |
+----------+---------+------------+---------------------+
| a | 1 | 2 | 2010-11-01 12:00:00 |
| b | 1 | 2 | 2010-11-01 11:00:00 |
| c | 2 | 3 | 2010-11-01 09:00:00 |
| d | 2 | 2 | 2010-11-02 08:00:00 |
| e | 3 | 2 | 2010-11-02 00:00:00 |
+----------+---------+------------+---------------------+
5 rows in set (0.00 sec)mysql> select date(infoTime) as `日期`,sum(infoMoney) as `费用`
-> from (
-> Select infoTime,infoMoney from info inner join user using(username) Where jifeiID=2 and infoTime between '2010-11-01 00:00:00' and '2010-11-02 23:59:59'
-> union all
-> select info2Time,info2Money From info2 where jifeiID=2 and info2Time Between '2010-11-01 00:00:00' And '2010-11-02 23:59:59'
-> ) t
-> group by date(infoTime);
+------------+------+
| 日期 | 费用 |
+------------+------+
| 2010-11-01 | 7 |
| 2010-11-02 | 2 |
+------------+------+
2 rows in set (0.08 sec)mysql>
2
3
....mysql> select NULL as `序号`,date(infoTime) as `日期`,sum(infoMoney) as `费用`
结果出不来数字。
MySQL中的ROWNUM的实现这个贴子中的问题对我来说已经解决了。
SELECT @num:=@num+1,IF(LENGTH(username1)=0,username2,username1) AS newuser,`timea`, SUM(infoMoney) AS 费用
FROM(
SELECT DATE_FORMAT(infoTime,'%Y-%m-%d') AS `timea`,infoMoney,username AS username1,'' AS username2 FROM info
UNION ALL
SELECT DATE_FORMAT(info2Time,'%Y-%m-%d'),info2Money,'',username AS username2 FROM info2
) tLEFT JOIN `user` s ON s.username=t.username1 LEFT JOIN `user` z ON z.username=t.username2
WHERE s.jifeiID=2 OR z.jifeiID=2
GROUP BY `timea`