2

私は次のクエリを持っています:

$count = (SELECT COUNT(*) FROM post GROUP BY ID
HAVING ID NOT IN (SELECT taxiID FROM taxi WHERE userID = '.$userID.' AND value IS NOT NULL)
ORDER BY postID), OBJECT);

カウントにはこれが含まれます:

count = Array ( [0] => stdClass Object ( [COUNT(*)] => 1 ) [1] => stdClass Object ( [COUNT(*)] => 1 ) [2] => stdClass Object ( [COUNT(*)] => 1 ) [3] => stdClass Object ( [COUNT(*)] => 1 ) [4] => stdClass Object ( [COUNT(*)] => 1 ) [5] => stdClass Object ( [COUNT(*)] => 1 ) [6] => stdClass Object ( [COUNT(*)] => 1 ) [7] => stdClass Object ( [COUNT(*)] => 1 ) [8] => stdClass Object ( [COUNT(*)] => 1 ) [9] => stdClass Object ( [COUNT(*)] => 1 ) [10] => stdClass Object ( [COUNT(*)] => 1 ) [11] => stdClass Object ( [COUNT(*)] => 1 ) [12] => stdClass Object ( [COUNT(*)] => 1 ) [13] => stdClass Object ( [COUNT(*)] => 1 ) [14] => stdClass Object ( [COUNT(*)] => 1 ) [15] => stdClass Object ( [COUNT(*)] => 1 ) [16] => stdClass Object ( [COUNT(*)] => 1 ) [17] => stdClass Object ( [COUNT(*)] => 1 ) [18] => stdClass Object ( [COUNT(*)] => 1 ) [19] => stdClass Object ( [COUNT(*)] => 1 )

上記で得られた結果の数を数える必要があります。実は、結果の使い方がわかりません!

私はこのコードを持っていましたが、今は機能しません:

<?php if($count[0]->{'COUNT(*)'} > 10){ ?
    echo "Load More";
}else { 
    echo "Nothing to load";
} ?>

$ countは10を超える必要があり、私のphpはLoad Moreをエコーする必要がありますが、ロードするものは何もエコーしていません。

タクシーのテーブルは次のようになります。

ID    taxiID    userID    value
1     1         1         1
2     1         6         1
3     1         4         0
4     2         1         0
5     2         6         1
6     2         4         0
7     3         6         1
8     3         4         0

投稿テーブルは次のようになります。

ID    postID    randomNum
1     1         564
2     2         789
3     3         234
4     4         845
5     5         089

$ userIDが1であるとすると、クエリはpostID 1,3,4,5を返します(1は好き、3は好きではなく、ユーザー1は嫌いではない、4、5は誰も好きではない、嫌いではない)。したがって、$ countには4が含まれている必要があります(4つの結果が見つかりました)。

クエリが非効率的である場合、どのようにそれを効率的に適応させるのですか?

最終的に、問題は次のようなことをどのように行うかです。

if ($count > 10) {}
4

6 に答える 6

3

問題は、クエリが期待どおりの結果を返さないことです(クエリをスタンドアロンで実行して、結果セットが期待どおりかどうかを確認することは常に役立ちます)。

そうです、これを分解しましょう。

ユーザーが好きではなかった、または嫌いだったすべての投稿をカウントしています。好き嫌いはタクシーのテーブルに保存されます。taxi.taxiIDはpost.IDと一致します。したがって、null以外の値を持つuserIDが見つかった場合は、そのpost.IDを無視してください。無視されないpost.IDを数えています

そのuserIDについて、タクシーテーブルに一致するレコードがないすべての投稿をカウントしようとしています。ここで必要なのはJOIN、テーブルに対して、post通常は結合によって除外される行を取得することです。これは、左外側の結合によって実現されます

編集済み

SELECT p.ID, t.taxiID
FROM post p LEFT OUTER JOIN taxi t ON p.ID = t.taxiID AND t.userID = '.$user.'
HAVING t.taxiID IS NULL

そのHAVING句は次のように言っています:対応するt.taxiIDを持たなかった結果セットの行のみ。

このクエリを実行して、期待される行のセット(そのユーザーによるいいねまたは嫌いがない投稿)を取得した場合は、外部クエリを追加して、返された行の数を数えることができます。

SELECT COUNT(*) as count FROM (
    SELECT p.ID, t.taxiID
    FROM post p LEFT OUTER JOIN taxi t ON p.ID = t.taxiID AND t.userID = '.$user.'
    HAVING t.taxiID IS NULL
) a

これにより、countという名前の単一のスカラーが返されます。この場合、次のように言うことができます。

if ($count[0]->count > 10) { blah blah blah }

2番目の編集)この内部クエリは、タクシーテーブルで値= 1であるか、値がまったくない投稿を取得します。その結果、例では4が返されます。

SELECT p.ID, t.taxiID, t.value
FROM post p LEFT OUTER JOIN taxi t ON p.ID = t.taxiID AND t.userID = '.$user.'
HAVING t.taxiID IS NULL OR t.value = 1
于 2012-04-19T03:55:52.373 に答える
1

MySQLのドキュメントによると、LIMIT句なしで返される結果の数を知りたい場合は、次のようにします。

SELECTステートメントには、サーバーがクライアントに返す行数を制限するLIMIT句を含めることができます。場合によっては、LIMITなしでステートメントが返される行数を知ることが望ましいが、ステートメントを再度実行することはありません。この行数を取得するには、SELECTステートメントにSQL_CALC_FOUND_ROWSオプションを含め、その後FOUND_ROWS()を呼び出します。

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
    -> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();

http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

于 2012-04-19T01:53:05.307 に答える
0
SELECT COUNT(*) FROM post
WHERE postID NOT IN                     
  ( SELECT taxiID
    FROM taxi 
    WHERE userID = '.$userID.'
      AND value = 0
  ) 
ORDER BY postID;
于 2012-04-19T01:51:27.737 に答える
0
SELECT COUNT(*) FROM post
WHERE postID NOT IN                     
  ( SELECT taxiID
    FROM taxi 
    WHERE userID = '.$userID.'
      AND value = 0
  )

これが機能しない場合は、エラーメッセージも提供していただけますか?

于 2012-04-19T01:52:53.737 に答える
0

なぜこれではないのですか?

SELECT COUNT(*) FROM post
WHERE postID NOT IN (
  SELECT taxiID FROM taxi 
  WHERE userID = '.$userID.' AND value = 0
)
LIMIT 10

order byカウントのみを探している場合は、を実行する必要がないことに注意してください。limitまた、そこにあるので、結果に10を超えるレコードが含まれないことに注意してください。それがアイデアかどうかはわかりません。

于 2012-04-19T01:53:02.623 に答える
0

私は答えを見つけました、そしてそれはとても単純でした:

if (count($count) > 10) {}
于 2012-04-19T03:39:52.057 に答える