表结构
表结构如下所示, 用户可以点赞和评论,最后需要综合点赞和评论数量对结果降序排列:
使用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中的as
case
函数等同于sql中的ifnull
func.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中时间比较的实现