0

ギャラリーを表示するphpページがあります。すべてのアイテムの下に、良い/悪い投票 (賛成/反対) や閲覧数などの情報を出力します。

コンテンツに挿入された行ごとに、content_views テーブルにも行が挿入されます。ただし、投票テーブルには、誰かが投票した場合にのみ行が含まれます (1 投票 = 1 行)。

特定のカテゴリ (ニッチ) 内のすべての情報 (content.*、ビュー、ある場合は投票) を選択したい。私が抱えている問題は、投票がない場合、クエリ (以下を参照) が空の結果を返すことです。

    $result = mysql_query("
    SELECT content.*, content_views.views as views, votes.good, votes.bad 
    FROM content, content_niches, content_views , votes
    WHERE content_views.content = content.record_num 
    AND content.approved = 2 
    AND content_niches.content = content.record_num 
    AND votes.content = content.record_num
    AND content_niches.niche = '$niche' 
    AND content.enabled = 1 
    GROUP BY content.record_num 
    ORDER BY $orderby DESC LIMIT $from,$max_results") or die(mysql_error());

もちろん、私は次のことを行うことができますが、コンテンツに 50K 行以上あり、さらに多くの投票があるため、これは非常に遅くなります。

    $result = mysql_query("
    SELECT content.*, content_views.views as views,
            (SELECT votes.good FROM votes WHERE votes.content=content.record_num) AS good,
            (SELECT votes.bad FROM votes WHERE votes.content=content.record_num) AS bad
    FROM content, content_niches, content_views 
    WHERE content_views.content = content.record_num 
    AND content.approved = 2 
    AND content_niches.content = content.record_num 
    AND votes.video = content.record_num
    AND content_niches.niche = '$niche' 
    AND content.enabled = 1 
    GROUP BY content.record_num 
    ORDER BY $orderby DESC LIMIT $from,$max_results") or die(mysql_error());

これを行う「正しい」方法は何ですか?

Edit1: 遅すぎる新しいクエリ、どうすればいいですか?

    $result = mysql_query("
    SELECT content.*,content_niches.*, content_views.views as views 
    FROM content
    INNER JOIN 
       content_niches ON (content_niches.content = content.record_num AND content_niches.niche = '$chanid')
    INNER JOIN
       content_views ON (content_views.content = content.record_num )
    LEFT OUTER JOIN votes
       ON (votes.video = content.record_num)
    WHERE content.approved = 2 
    AND content.enabled = 1 
    GROUP BY content.record_num 
    ORDER BY $orderby DESC LIMIT $from,$max_results") or die(mysql_error());
4

1 に答える 1

1

それはと呼ばれますouter join。左外部結合は、左側からすべての行を返し、右側から一致する行のみを返します。

したがって、たとえば、1票の投稿と0票の投稿があり、これを行う場合:

select * 
from posts
left outer join votes
  on posts.id = votes.id

存在し、対応するすべての投稿と投票レコードが返されます。

非ansi結合の代わりにansi-join構文を使用することを実際に学ぶ必要があります

于 2012-07-16T16:12:57.163 に答える