/
Вопросы и ответы
/
SQL
/

Как в sql посчитать количество повторяющихся значений

Как в sql посчитать количество повторяющихся значений

5 лет назад

Человек-Молекула

Ответы

0

Можно попробовать использовать функцию COUNT() в сочетании с оператором GROUP BY.

Предположим, у нас есть таблица "orders" с колонками "customer_name" и "order_date", и мы хотим посчитать, сколько заказов было сделано каждым клиентом. Мы можем написать следующий SQL-запрос:

1
2
3
SELECT customer_name, COUNT(*) as order_count
FROM orders
GROUP BY customer_name

Этот запрос выберет все уникальные значения из колонки "customer_name" в таблице "orders" и подсчитает количество строк, связанных с каждым уникальным значением. Результатом запроса будет таблица со столбцами "customer_name" и "order_count", в которой каждая строка будет показывать клиента и количество его заказов.

4 года назад

Алексей Алешин

0

запрос работает в бд, но не выводит информацию на сайт php

как его правильно вывести?

я пробовала такой код:

3 года назад

0

Сколько раз встречается каждое значение, считают через GROUP BY и COUNT(*):

1
2
3
4
SELECT city, COUNT(*) AS cnt
FROM users
GROUP BY city
ORDER BY cnt DESC;

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

Только повторяющиеся значения

Условие на результат группировки пишут в HAVING:

1
2
3
4
SELECT email, COUNT(*) AS cnt
FROM users
GROUP BY email
HAVING COUNT(*) > 1;

Так находят дубли: email, которые встречаются больше одного раза. WHERE здесь не подойдёт — он фильтрует строки до группировки.

Повторы по нескольким столбцам

1
2
3
4
SELECT first_name, last_name, COUNT(*) AS cnt
FROM users
GROUP BY first_name, last_name
HAVING COUNT(*) > 1;

Все строки-дубли целиком

GROUP BY сворачивает дубли в одну строку. Чтобы увидеть каждую повторяющуюся запись с её id, используйте оконную функцию:

1
2
3
4
5
6
7
SELECT *
FROM (
  SELECT id, email, COUNT(*) OVER (PARTITION BY email) AS cnt
  FROM users
) t
WHERE cnt > 1
ORDER BY email;

Сколько значений повторяется

1
2
SELECT COUNT(*) AS total, COUNT(DISTINCT email) AS uniq
FROM users;

Разница total - uniq — число лишних строк-дублей.

Как вывести результат на сайт через PHP

В комментарии спрашивали, почему запрос работает в базе, а на странице пусто. Результат запроса нужно получить через fetchAll() и вывести в цикле:

1
2
3
4
5
6
7
8
9
<?php
$db = new PDO('mysql:host=localhost;dbname=les;charset=utf8mb4', 'root', '');
$rows = $db->query('SELECT Name, COUNT(*) AS order_count FROM favorit GROUP BY Name')
    ->fetchAll(PDO::FETCH_ASSOC);
?>

<?php foreach ($rows as $row): ?>
  <p><?= htmlspecialchars($row['Name']) ?>: <?= $row['order_count'] ?></p>
<?php endforeach; ?>

В строке подключения не должно быть пробелов: mysql:host=localhost;dbname=les. С пробелом после двоеточия PDO не видит параметр host.

Группировку и агрегатные функции разбирают в бесплатном курсе «Основы SQL».

7 дней назад

Никита Вихров

+7 800 100 22 47

бесплатно по РФ

+7 495 085 21 62

бесплатно по Москве

108813 г. Москва, вн.тер.г. поселение Московский,
г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3
ОГРН 1217300010476
ИНН 7325174845