PHP コードを使用して、MySQL の結果を特定の方法で並べ替えたいと考えています。
私は2つのテーブルを持っています:
次の非網羅的なコンテンツを含む「投稿」と呼ばれる最初のテーブル:
- ID
- リリース日
- 公開日
- ...
次の非網羅的な内容を持つ「投票」と呼ばれる 2 番目のテーブル:
- ID
- post_id
- ユーザーID
- 状態
ユーザーが既存の投稿に投票すると、"votes" テーブルにレコードが作成され、投稿 ID が post_id として、ユーザー ID が user_id として挿入されます。ステータスは、賛成票の場合は 1、反対票の場合は 2 です。
ただし、覚えておくべき重要な点が 1 つあります。たとえば、一部の投稿はまったく投票されない可能性があり、2 番目のテーブルで 0 件が見つかる場合があります。
したがって、最初のページで、次のように投票数 (upvotes-downvotes) で投稿を並べ替えると、正常に動作します。
$post_req = mysql_query('SELECT * FROM post
WHERE NOW() > released_date
ORDER BY ((SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 1)-(SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 2)) DESC, published_date DESC
LIMIT 0, 5');
しかし、次のページ (つまり、新しいイテレーション) では、投票に関して、私が残したところから続行する必要があります。その前に、変数 $last_post_votes の下に、最初のページの最後の投稿の票数を保存して、次のページに渡します。
さて、これは私が苦労しているところです。新しいリクエストで、この変数よりも投票数が少ない投稿を探す必要があります。次のように、私の失敗した試み:
$post_req_1 = mysql_query('SELECT * FROM post
WHERE NOW() > released_date
AND ((SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 1)-(SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 2)) < "'.$last_post_votes.'"
ORDER BY ((SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 1)-(SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 2)) DESC, published_date DESC
LIMIT 5');
そして、私はそのようなことを試みましたが、それも失敗しました:
$post_req_1 = mysql_query('SELECT post.*,
((SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 1)-(SELECT COUNT(*) FROM votes WHERE votes.poste_id = post.id AND votes.status = 2)) AS all_votes
FROM post, votes
WHERE NOW() > post.released_date
AND all_votes < "'.$last_post_votes.'"
ORDER BY all_votes DESC, post.published_date DESC
LIMIT 5');
問題は明らかに、SELECT で別のテーブルから結果を検索するときの条件です。
どんな助けでも大歓迎です!
よろしくお願いします!:-)
ロイス
編集:
それ自体で条件を直接使用することで、希望どおりに機能させることができましたORDER BY
。それが非常に適切かどうかはわかりませんが、うまくいくようです:
$post_req_1 = mysql_query('SELECT * FROM post
WHERE NOW() > released_date
ORDER BY ((SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 1)-(SELECT COUNT(*) FROM votes WHERE votes.post_id = post.id AND votes.status = 2)) < "'.$last_post_votes_passed.'" DESC, published_date DESC
LIMIT 5');