1

最後の 3 行に同じ userId があるかどうかを確認しようとしています... count を試しましたが、distinct を選択してもうまくいきません。何か案は?

id   userId  gameId switchId won
--------------------------------
1     1515     5       475    0
2     1515     5       475    0
3     1515     5       475    0

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
$st = $db->prepare("SELECT COUNT(userId) AS total FROM arcadeGamesInPlay WHERE userId=:userid,gameId=:gameId AND switchId=:switchId AND won=:won ORDER by id DESC LIMIT :limit"); // need to filter for next auction
$st->bindParam(':userId', $userId);
$st->bindParam(':gameId', $gameId);
$st->bindParam(':switchId', $switchId);
$st->bindParam(':won', $won);
$st->bindParam(':limit', $limit);

$limit=3;
$won=0;
$st->execute();
$r = $st->fetch(PDO::FETCH_ASSOC);

$playedLastThreeGames= $r['total'];
4

1 に答える 1

1

これには、ネストされたクエリが必要です。次のようなクエリを想像してください。

SELECT COUNT(DISTINCT userId) FROM arcadeGamesInPlay WHERE id IN (1, 2, 3);

これは、リストされた 3 つの行で見つかった一意のユーザー ID の数を返します1

これをクエリと組み合わせて、最後の 3 行を選択できます。おそらく次のようなものです:

SELECT id FROM arcadeGamesInPlay ORDER BY id DESC LIMIT 3

...ただし、WHERE節を追加することもできます。

全体として、クエリは次のようになります。

SELECT COUNT(DISTINCT userId)
FROM arcadeGamesInPlay
WHERE id IN (
    SELECT id
    FROM arcadeGamesInPlay
    ORDER BY id DESC
    LIMIT 3
);

そうは言っても、実際に接続しているデータベースを指定していません。それが MySQL の場合、MySQL は演算子LIMITを使用したサブクエリの句をサポートしていないため、問題が発生しINます。

MySQL で動作するサブクエリの別の形式は次のようになります。

SELECT COUNT(DISTINCT userId)
FROM (
    SELECT userId
    FROM arcadeGamesInPlay
    ORDER BY id DESC
    LIMIT 3
) u;

両方のクエリを示す SQL Fiddle は、http ://sqlfiddle.com/#!2/dda29/4 で確認できます。

LIMITMySQL で動作するように、最初のクエリの一部をコメントアウトしました。データベース エンジンを別のもの (PostgreSQL など) に変更した場合、そのコメントを解除すると、両方のクエリが適切に機能するはずです。

于 2013-08-04T04:09:09.417 に答える