希望最好使用一个查询来获取数据,但根据所选值,列是动态的。
所以我的表看起来像这样(使用MySql):
CREATE TABLE 'users' (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) NOT NULL
)
CREATE TABLE `income` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`timestamp` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`user` int(11) NOT NULL,
`day` int(11) NOT NULL DEFAULT '0',
`action_a` decimal(10,2) NOT NULL DEFAULT '0.00',
`action_b` decimal(10,2) NOT NULL DEFAULT '0.00',
`action_c` decimal(10,2) NOT NULL DEFAULT '0.00',
PRIMARY KEY (`id`)
)
CREATE TABLE `given` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`timestamp` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`day` int(11) DEFAULT NULL,
`to_user` int(11) NOT NULL,
`from_user` int(11) NOT NULL,
`amount` decimal(10,2) NOT NULL DEFAULT '0.00',
PRIMARY KEY (`id`)
)
想进入一个看起来像这样的查询表:
+------------+--------------+----------+----------+----------+
| day | action_a | action_b | action_c | user_B | user_C |
+------------+--------------+----------+----------+----------+
| 123 | 123.01 | 123.01 | 123.01 | 123.01 | -123.01 |
| 122 | 324.02 | 234.01 | 123.01 | -123.01 | -123.01 |
| 121 | 987.00 | 345.01 | 123.01 | 123.01 | -123.01 |
| 120 | 9393.01 | 456.01 | 123.01 | -123.01 | -123.01 |
| 119 | 0.00 | 567.01 | 123.01 | -123.01 | -123.01 |
...
用户列中的负值表示用户已将其提供给其他用户
目前,我正在进行3次单独查询,然后合并数据,但我当前的查询如下所示:
获取基于行动的收入
Select action_a, action_b, action_c From income i Join users u on u.id=i.user Where u.name='%s' and i.day=%i Order by i.id desc
收到
Select u2.name 'from', amount From given g Join users u on u.id = to_user Join users u2 on u2.id = from_user Where u.name='%s' and amount <> 0.0 Order by g.id
获得
Select u2.name 'to', amount From given g Join users u on u.id = from_user Join users u2 on u2.id = to_user Where u.name='%s' and amount <> 0.0 Order by g.id desc
答案 0 :(得分:0)
规范化收入/收入比表的一个例子如下:
CREATE TABLE income
(income_id SERIAL PRIMARY KEY
,dt datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
,user INT NOT NULL
);
CREATE TABLE income_action
(income_id INT NOT NULL
,action CHAR(1) NOT NULL
,value DECIMAL(10,2) NOT NULL DEFAULT '0.00',
,PRIMARY KEY(income_id,action)
);