【发布时间】:2016-05-25 12:07:30
【问题描述】:
我有一张这样的桌子:
// notifications
+----+--------------+------+---------+------------+
| id | event | seen | id_user | time_stamp |
+----+--------------+------+---------+------------+
| 1 | vote | 1 | 123 | 1464174617 |
| 2 | comment | 1 | 456 | 1464174664 |
| 3 | vote | 1 | 123 | 1464174725 |
| 4 | answer | 1 | 123 | 1464174813 |
| 5 | comment | NULL | 456 | 1464174928 |
| 6 | comment | 1 | 123 | 1464175114 |
| 7 | vote | NULL | 456 | 1464175317 |
| 8 | answer | NULL | 123 | 1464175279 |
| 9 | vote | NULL | 123 | 1464176618 |
+----+--------------+------+---------+------------+
我正在尝试创建一个最近收件箱消息框。我想根据这个条件为每个用户获取已读和未读消息:
注意:列表末尾应始终至少有 2 条消息被读取 (seen = 1)。
默认情况下,结果应包含 15 行。除非:
- 还有超过 13 条未读消息 (
seen = NULL)(加上两条已读且始终存在的已读消息)。 - 所有消息总共少于 15 条。
以下是一些示例:(已读消息:seen = 1,未读消息:seen = NULL)
- 信息:已读消息:1,未读消息:1
- 输出: 2 行。 (包含一条已读消息和一条未读消息)
- 信息:已读消息:40,未读消息:1
- 输出: 15 行。 (包含 14 条已读消息和 1 条未读消息)
- 信息:已读消息:12,未读消息:20
- 输出: 22 行。 (包含 2 条已读消息和 20 条未读消息)
- 信息:已读消息:0,未读消息:16
- 输出: 16 行。 (包含 0 条已读消息和 16 条未读消息)
- 信息:已读消息:25,未读消息:15
- 输出: 17 行。 (包含 2 条已读消息和 15 条未读消息)
- 信息:已读消息:4,未读消息:8
- 输出: 12 行。 (包含 4 条已读消息和 8 条未读消息)
- 信息:已读消息:745,未读消息:4
- 输出: 15 行。 (包含 11 条已读消息和 4 条未读消息)
如您所见,我正在尝试获取所有未读消息以及至少两条已读消息。默认情况下,行数应为 15。我该怎么做?
这是我的查询:
SELECT id, event seen, time_stamp
FROM notifications
WHERE id_user = :id AND
LIMIT 15 OR IF (seen IS NULL > 15) THEN seen AND
SELECT id, event seen, time_stamp FROM notification
WHERE id_user = :id AND seen IS NOT NULL LIMIT 2
ENDIF
【问题讨论】: