0

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');
4

2 に答える 2

0

私が間違っていなければ、これはあなたが探しているものですか?

SELECT p.id, IFNULL(COUNT(v.id), 0) - IFNULL(COUNT(v2.id), 0) AS `Votes`
FROM
posts p 
LEFT JOIN votes v on v.post_id = p.id AND v.status = 1
LEFT JOIN votes v2 on v2.post_id = p.id and v.status = 2
WHERE NOW() > p.released_date
ORDER BY `Votes` DESC;
于 2013-10-16T20:49:54.447 に答える