چگونه در MySQL دستور LIMIT رو داینامیک کنیم؟
https://lamtakam.com/qanda/2934/چگونه-در-MySQL-دستور-LIMIT-رو-داینامیک-کنیم؟ 0دارم روی بخش نوتیفیکیشن های یک پروژه کار میکنم. جدول notifications
به این شکل هست ساختارش:
// 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 |
+----+--------------+------+---------+------------+
من قصد دارم اون لیست نوتیفیکیشن ها رو بسازم که وقتی روی زنگوله نوتیفیکیشن ها کلیک میشه، لیستش باز میشه. توی اون لیست میخوام حداقل 15 تا نوتیفیکیشن باشه (اگه موجوده)، فقط 2 تا شرط وجود داره:
-
همیشه تمام نوتیفیکیشن های دیده نشده (
seen = NULL
) باید باشن (یعنی select بشن توی کوئری)، حتی اگه همونا تعدادشون از 15 تا عبور کنه. - اگر تعداد نوتیفیکیشن های دیده نشده از 14 تا بیشتر بود، باید 2 تا از نوتیفیکیشن های دیده شده (
seen = 1
) هم باشن توی لیست (یعنی select بشن توی کوئری)
مثال: توی جدول پایین، read
تعداد سطرهایی (نوتیفیکیشن هایی) هستن که خوانده شدن و unread
تعداد نوتیفیکیشن هایی هستن که خوانده نشدن توی جدول notifications
:
read | unread | output should be
------|--------|-------------------------------------
3 | 8 | 11 rows
12 | 5 | 15 rows (5 unread, 10 read)
20 | 30 | 32 rows (30 unread, 2 read)
10 | 0 | 10 rows (0 unread, 10 read)
10 | 1 | 11 rows (1 unread, 10 read)
10 | 6 | 15 rows (6 unread, 9 read)
100 | 3 | 15 rows (3 unread, 12 read)
3 | 100 | 102 rows (100 unread, 2 read)
فکر میکنم جدول بالا بهترین توضیح هست.
- مثلا توی سطر اول گفته که اگر مثلا 3 تا نوتیفیکیشن خوانده شده داشته باشیم و 8 تا خوانده نشده، باید 11 تا نوتیفیکیشن (همش) select بشه.
- یا مثلا توی سطر 2 گفته که اگر مثلا 12 تا نوتیفیکیشن خوانده شده داشته باشیم و 5 تا خوانده نشده، باید مجموعا 15 تا نوتیفیکیشن select بشه که متشکل از 5 تا خوانده نشده و 10 ت خوانده شده هست.
تا اینجای کوئری رو خودم تونستم بنویسم، ممنون میشم اگر کمکم کنید تمومش کنم:
SELECT id, event, seen, time_stamp
FROM notifications n
WHERE id_user = :id AND seen IS NULL
) UNION
(SELECT id, event, seen, time_stamp
FROM notifications n
WHERE id_user = :id
ORDER BY (seen IS NULL) desc, time_stamp desc
LIMIT 15
)
ORDER BY (seen IS NULL) desc, time_stamp desc;