mysql,表设计

查看:97
本文介绍了mysql,表设计的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

五个人一起吃饭, 每次吃饭都是随机某个人掏钱,每次吃饭不一定五个人都来(可能某些人不来,这是重点),每30天算一次账,如何算出每个人应该掏多少钱!表如何设计?sql怎么写?

这是最近面试碰到的题!感觉挺有意思,自己对sql不是很了解,想了两天没有结果,求大神帮忙,谢谢!

解决方案

闲着没事搞了一下,欢迎指教。。
用户表:

CREATE TABLE `usr` (
  `uid` int(11) NOT NULL,
  `name` char(10) DEFAULT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

吃饭记录表:

CREATE TABLE `meal` (
  `mid` int(11) NOT NULL,
  `money` int(11) DEFAULT NULL comment '付款金额',
  `pay_uid` int(11) DEFAULT NULL comment '付款人员id',
  `dt` date DEFAULT NULL,
  PRIMARY KEY (`mid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

吃饭人员流水表:

CREATE TABLE `meal_jnl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `mid` int(11) DEFAULT NULL,
  `in_uid` int(11) DEFAULT NULL comment '参加人员id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=52 DEFAULT CHARSET=utf8;

造数据:

INSERT INTO `usr` (`uid`, `name`)
VALUES
    (1, 'jim'),
    (2, 'jeak'),
    (3, 'lucy'),
    (4, 'carl'),
    (5, 'jerry'),
    (6, 'mark');
INSERT INTO `meal` (`mid`, `money`, `pay_uid`, `dt`)
VALUES
    (1, 122, 2, '2017-06-01'),
    (2, 56, 4, '2017-06-01'),
    (3, 56, 1, '2017-06-02'),
    (4, 76, 3, '2017-06-03'),
    (5, 54, 5, '2017-06-04'),
    (6, 66, 2, '2017-06-05'),
    (7, 77, 2, '2017-06-05'),
    (8, 34, 3, '2017-06-06'),
    (9, 54, 1, '2017-06-07'),
    (10, 77, 4, '2017-06-08'),
    (11, 45, 5, '2017-06-08'),
    (12, 87, 2, '2017-06-10'),
    (13, 123, 3, '2017-06-11'),
    (14, 431, 1, '2017-06-11'),
    (15, 23, 4, '2017-06-12');
INSERT INTO `meal_jnl` (`id`, `mid`, `in_uid`)
VALUES
    (1, 1, 2),
    (2, 1, 3),
    (3, 1, 4),
    (4, 1, 5),
    (5, 2, 1),
    (6, 2, 2),
    (7, 2, 4),
    (8, 2, 5),
    (9, 3, 1),
    (10, 3, 2),
    (11, 3, 3),
    (12, 3, 4),
    (13, 3, 5),
    (14, 4, 3),
    (15, 4, 4),
    (16, 4, 5),
    (17, 5, 2),
    (18, 5, 5),
    (19, 6, 4),
    (20, 6, 5),
    (21, 6, 1),
    (22, 6, 2),
    (23, 7, 2),
    (24, 7, 5),
    (25, 7, 1),
    (26, 8, 2),
    (27, 8, 3),
    (28, 8, 4),
    (29, 8, 5),
    (30, 9, 1),
    (31, 9, 4),
    (32, 10, 1),
    (33, 10, 2),
    (34, 10, 3),
    (35, 10, 4),
    (36, 10, 5),
    (37, 11, 1),
    (38, 11, 2),
    (39, 11, 5),
    (40, 12, 2),
    (41, 12, 5),
    (42, 13, 3),
    (43, 13, 1),
    (44, 14, 1),
    (45, 14, 3),
    (46, 14, 4),
    (47, 15, 3),
    (48, 15, 4),
    (49, 15, 5),
    (50, 15, 6),
    (51, 11, 6);

获取没人月底应付金额:

select in_uid,out_mon-pay_mon tm,name from (
    select sum(case when money is null then 0 else money end) pay_mon,uid,name 
    from meal right join usr 
    on meal.`pay_uid`=usr.uid 
    where dt between '' and ''
    group by pay_uid) aaa 
right join (
    select in_uid,sum(am) out_mon 
    from (
        select a.mid,money/count(in_uid) am 
        from meal_jnl a join meal b 
        on a.mid=b.mid 
        where b.dt between '' and ''
        group by mid) aa 
    join meal_jnl bb 
    on aa.mid=bb.mid group by in_uid) bbb 
on aaa.uid=bbb.in_uid;

这篇关于mysql,表设计的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆