Как рассчитать уникальные строки в php pdo?

Вот мой обычный способ подсчета строк …

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

Это будет подсчитывать все строки, даже если я использую предложение WHERE, оно будет по-прежнему считать каждую строку, которая соответствует этому условию. Однако, скажем, у меня есть таблица, мы назовем ее tokensEarned (это мое реальное имя таблицы). У меня есть следующие данные …

user_id = 1,2,4,5,8,8,2,4,3,7,6,2 (это фактические строки в моей таблице — ясно, что у пользователя 1 есть 1 запись, у 2 есть три записи и т. д.) Всего у меня 12 записей. Но я не хочу, чтобы мой запрос насчитывал 12. Я хочу, чтобы мой запрос подсчитывал каждый user_id один раз. В этом примере мой счет должен отображать 8.

Любая помощь в этом? Я могу объяснить, если у вас есть какие-либо конкретные вопросы или разъяснения, которые вам нужны. Буду премного благодарен. Благодарю вас.

0

Решение

Вы можете использовать Different в MySQL, чтобы выбрать только уникальные поля в вашей таблице.

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

Другие решения

Следующий запрос даст различное количество пользователей:

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

Невозможно получить все записи и отчетливый счет в одном запросе.

Используете ли вы запрос выше или возвращаете все фактические отдельные строки, действительно зависит от того, нужны ли вам полные записи. Если все, что вам нужно, это подсчет, то возвращать данные в записи бесполезно, и то, что я привел выше, вероятно, является наилучшим вариантом. Если вам нужны данные, тогда выбор всех отдельных строк может иметь больше смысла.

1

Измените ваш запрос на следующий, таким образом, вы показываете только уникальные user_id:

$query = "SELECT DISTINCT user_id FROM users";
0
По вопросам рекламы [email protected]