8

私が実装しようとしているのは、SO にあるものと似ています。前日、先月などの賛成票で投稿をランク付けしたいのですが、私のスキーマは2つのテーブルを構成しています。

post(id, post, posted_on..)
vote(post_id, vote_value, date)

スキーマがかなり自明であることを願っています。問題は、投稿と投票に内部結合を作成し、where 句 (' votes.date >= DATE_SUB(CURDATE(), INTERVAL 1 DAY') を使用して「日ごと」に並べ替えると、意図したとおりに機能しますが、他の投稿を表示できません。つまり、最終日に投票されなかった投稿は完全に無視されます。私が望むのは、それらの投稿の優先度が低くても、クエリに表示されることです。

一方、ユニオン操作を使用することを考えるかもしれませんが、別のアプローチを探していました。

更新:1、2の2つの投稿があるとしましょう。

投票表は次のようなものです

post_id       vote_value      date
1              1              2012-12-19
2              1              2012-12-10

私のアプローチに従ってクエリを実行すると、日付の制約を設定したため、「1」という投稿のみが表示されますが、両方を表示したいのです。これが私のクエリです:

SELECT `id`, SUM(`votes`.`votes`) AS likes_t, `post`.* FROM `posts` JOIN `votes` ON (`id` = `votes`.`post_id`) WHERE `votes`.`date` >= DATE_SUB(CURDATE(), INTERVAL 2 DAY) 
4

2 に答える 2

2

私がそれを正しく理解した場合:

SELECT *, IF(vote.date>=DATE_SUB(CURDATE(), INTERVAL 1 DAY), 1, 0) as rate FROM post INNER JOIN vote ON (post.id=vote.post_id) ORDER BY rate DESC;

+------+--------+---------+------+---------------------+------+
| id   | post   | post_id | vote | date                | rate |
+------+--------+---------+------+---------------------+------+
|    1 | first  |       1 |    1 | 2012-12-19 00:00:00 |    1 |
|    1 | first  |       1 |    1 | 2012-12-13 00:00:00 |    0 |
|    2 | second |       2 |    1 | 2012-12-10 00:00:00 |    0 |
+------+--------+---------+------+---------------------+------+
于 2012-12-19T09:29:00.240 に答える
2

すべての投稿を表示したいが、最近の投票のみをカウントする場合は、次のようにします。

SELECT `id`,
       SUM(IF(`votes`.`date` >= DATE_SUB(CURDATE(), INTERVAL 2 DAY, `votes`.`votes`, 0)) AS likes_t, 
       `post`.*
       FROM `posts` JOIN `votes` ON (`id` = `votes`.`post_id`)
于 2012-12-19T09:29:08.113 に答える