0

私が持っている投稿の数を取得しようとしています

これが私のクエリです

$Query="
    SELECT t.*,u.*,c.*
    FROM posts as t
    LEFT JOIN relations as r on r.post_id = t.post_id
    LEFT JOIN users as u on t.auther_id = u.auther_id
    LEFT JOIN categories as c on c.cate_id = r.cate_id
    GROUP BY t.post_id
";

    $Query=mysql_query($Query);
    $numberOfPosts=mysql_num_rows($Query);

このクエリは非常にうまく機能します

しかし、私はそれを変換しようとしています、私はそれをより速くしたいです

count(*)代わりに使いたいt.*

t.* を使用すると、投稿とカテゴリの完全なデータが取得されるため

しかし、私はカウントのみを取得したいので、count(*)使用することにしましたが、このようなクエリで使用する方法がわかりません

編集

SELECTt.*,u.*,c.*を SELECTに置き換えましたcount(t.*)

しかし、mysqlエラーが発生しましたWarning: mysql_fetch_assoc(): supplied argument

編集2:

私は選択しようとしていますcount(t.post_title)

私はこの結果を得ました

Array ( [count(t.post_id)] => 10 ) 

しかし、私は2つの投稿しかありません!

4

4 に答える 4

2
$Query="
    SELECT t.*,u.*,c.*
    FROM posts as t
    LEFT JOIN relations as r on r.post_id = t.post_id
    LEFT JOIN users as u on t.auther_id = u.auther_id
    LEFT JOIN categories as c on c.cate_id = r.cate_id
    GROUP BY t.post_id
";

    $Query=mysql_query($Query);
    $numberOfPosts=mysql_num_rows($Query);

一歩下がって、このクエリを少し分析してみましょう。

クエリで使用される 4 つのテーブルのうち 3 つからすべてを選択しています。結合は、選択したものを適切なカテゴリ、作成者などに制限するためのロジックを作成します。1 日の終わりに、データベースから大量のデータを取得し、PHP で返された行数を単純に尋ねます ( mysql_num_rows)。代わりに、@Dagon がコメントで提案しようとしているのは、MySQL に単純に結果を数えさせ、それを返すことです。

クエリをリファクタリングしましょう。

$query = "
    SELECT COUNT(t.post_id) AS qty
    FROM posts as t
        LEFT JOIN relations AS r ON r.post_id = t.post_id
        LEFT JOIN users AS u ON t.auther_id = u.auther_id
        LEFT JOIN categories AS c ON c.cate_id = r.cate_id
        GROUP BY t.post_id
";

    $result = mysql_query($query);
    $result_row = mysql_fetch_assoc($result);
    $numberOfPosts = $result_row['qty'];

( Barattlo のカスタム execute_scalar 関数を使用して読みやすくすることもできます。)

クエリを最適化して目的の結果を得る方法について、テーブル構造がより役立つようにする必要があります。

于 2012-10-08T19:44:31.967 に答える
0

これを試してみてください:

  $Query="
  SELECT count(t.*) as count_all
  FROM posts as t
  LEFT JOIN relations as r on r.post_id = t.post_id
  LEFT JOIN users as u on t.auther_id = u.auther_id
  LEFT JOIN categories as c on c.cate_id = r.cate_id
  GROUP BY t.post_id
  ";

$Query=mysql_query($Query);
$numberOfPosts=mysql_num_rows($Query);
于 2012-10-08T19:34:05.780 に答える
0

あなたがしたい

SELECT count(t.id) AS count FROM ....

//do query with PDO or whatever you are using

$rows = mysql_fetch_assoc();
$num_rows = $rows['count'];
于 2012-10-08T19:34:27.870 に答える
0

おそらく単に使用する必要があります

SELECT count(*) as postingcount FROM posts

なんで?

WHERE 句がないため、制限はありません。JOINS は結果セットに行を追加しません。最終的に、GROUP BY は、1 つの行に結合したために発生した可能性のある post_id のすべての重複発生をマージします。結果はカウントするだけでよいため、知りたい実数がテーブル ポスト内のデータ セットの数であると仮定すると、結合は必要なく、count(*) を実行することは実際にテーブルに対する非常に高速な操作です。 MySQL。

mysql_error() をチェックして、クエリにエラーがある理由を確認する必要があるため、mysql_query が false を返すかどうかを確認することを忘れないでください。

于 2012-10-08T19:38:49.580 に答える