1

我正在查看最后 3 行是否具有相同的 userId ...我尝试过计数,选择​​ 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);

这将返回在列出的三行中找到的唯一用户 ID 的数量 - 如果返回1,那么您知道它们都是相同的。

您可以将其与查询结合使用以选择最后三行。也许是这样的:

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

我已经注释掉了LIMIT第一个查询的部分,所以它可以在 MySQL 中工作。如果您将数据库引擎更改为其他内容(例如 PostgreSQL),您应该能够取消注释并让两个查询正常工作。

于 2013-08-04T04:09:09.417 回答