表结构
表结构如下所示, 用户可以点赞和评论,最后需要综合点赞和评论数量对结果降序排列:
使用sqlalchemy建模
1 | from flask.ext.sqlalchemy import SQLAlchemy |
- 对于
modified和created的default值需要传入的是datetime.now这个函数,并非datetime.now(),
后者是一个具体的值,不会动态变化,取值为模块第一次载入时的时间 - 字段
modified设置了属性onupdate,当任意字段值更新后modified字段值会更新为当前时间 DatingShowLike和DatingShowComment分别对引用关系设置了cascade属性,all中包含了delete,意思是父对象删除时子对象也跟着删除,delete-orphan设置当引用关系解除时,子对象被删除
查询晒约榜的评论的点赞数量
评论算2票,点赞算1票,按得票总数降序排列。
sql版本如下:
1 | select |
ifnull,当查询的某一字段结果为null时指定一个默认值替换,下边是两种情况下的结果- 不使用
ifnull的查询结果如下,有一个字段为空,结果则为空:
- 使用了
ifnull的结果如下,空的字段被当做0处理:
- 不使用
curdate,返回当前日期字符串1
2
3
4
5
6
7mysql> select curdate();
+------------+
| curdate() |
+------------+
| 2016-01-12 |
+------------+
1 row in set (0.00 sec)date_sub,日期减法操作1
2
3
4
5
6
7mysql> select date_sub(curdate(), interval 1 day);
+-------------------------------------+
| date_sub(curdate(), interval 1 day) |
+-------------------------------------+
| 2016-01-11 |
+-------------------------------------+
1 row in set (0.00 sec)
sqlalchemy 版本
1 | from sqlalchemy import case |
label方法用于给查询的字段起一个别名,同sql中的ascase函数等同于sql中的ifnullfunc.count等同于sql中的count函数
输出结果如下,对比sql查询结果一致:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21>>> for res in s.query(end_subquery).order_by(end_subquery.c.total_count.desc(), end_subquery.c.id.desc()):
... print res.id, res.created.date(), res.comment_count, res.like_count, res.total_count
...
68 2015-12-29 3 4 10
65 2015-12-28 2 4 8
69 2015-12-30 2 2 6
62 2015-12-27 2 2 6
63 2015-12-27 2 1 5
59 2015-12-26 1 3 5
78 2015-12-30 0 3 3
72 2015-12-30 1 1 3
71 2015-12-30 0 3 3
70 2015-12-30 0 3 3
61 2015-12-26 0 3 3
56 2015-12-26 0 3 3
51 2015-12-25 1 1 3
80 2016-01-04 0 2 2
76 2015-12-30 0 2 2
75 2015-12-30 0 2 2
60 2015-12-26 0 2 2
58 2015-12-26 0 2 2
参考链接:
mysql中时间比较的实现