如何计算 php pdo 中的唯一行数?

How do I count unique rows in php pdo?

这是我常用的行数计算方式...

$query = "SELECT * FROM users";
$stmt = $db->prepare($query);
$stmt->execute();
$count = $stmt->rowCount();

这将计算所有行,即使我使用 WHERE 子句,它仍将计算满足该条件的每一行。但是,假设我有一个 table,我们将其称为 tokensEarned(这是我的实际 table 名称)。我有以下数据...

user_id = 1,2,4,5,8,8,2,4,3,7,6,2(这些是我 table 中的实际行 - 显然,用户1 有 1 个条目,2 有 3 个条目,等等)我总共有 12 个条目。但我不希望我的查询计数为 12。我希望我的查询每个 user_id 计数一次。在这个例子中,我的计数应该显示 8.

有什么帮助吗?如果您有任何具体问题或需要澄清,我可以进一步解释。我会很感激。谢谢。

以下查询将产生不同的用户数:

$query = "SELECT COUNT(DISTINCT user_id) AS cnt FROM users";
$stmt = $db->prepare($query);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
echo "distinct user count: " . $row['cnt'];

不可能在单个查询中获取所有记录和非重复计数。

是使用上面的查询还是 return 所有实际的不同行实际上取决于您是否需要完整记录。如果你只需要计数,那么 return 记录中的数据很浪费,我上面给出的可能是最好的选择。如果您确实需要数据,那么选择所有不同的行可能更有意义。

将您的查询更改为以下内容,这样您只显示唯一的 user_id:

$query = "SELECT DISTINCT user_id FROM users";

您可以在 mysql 中使用 distinct 至 select 仅在您的 table 中使用唯一字段。

$query = "SELECT distinct user_id FROM users";
$stmt = $db->prepare($query);
$stmt->execute();
$count = $stmt->rowCount();