【问题标题】:Does Last 3 rows have the same user id?最后 3 行是否具有相同的用户 ID?
【发布时间】:2023-04-11 05:08:01
【问题描述】:

我正在查看最后 3 行是否具有相同的 userId... 我试过计数,选择​​不同但没有运气。有什么想法吗?

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'];

【问题讨论】:

  • 您需要在 bindParam 之前设置您的参数值变量

标签: php sql subquery


【解决方案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),您应该能够取消注释并让两个查询都正常工作。

【讨论】:

    猜你喜欢
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多