Как подсчитать и вывести количество совпадений значения в строке при запросе в MySQL?

Ссылка скопирована
1 ответ

Господа, вопрос:

Есть БД со столбцами 'date', 'name' и 'phone'
Где в разных строках значение 'phone' может быть одинаковым.

Как подсчитать кол-во совпадений значений 'phone' и вывести в результатах вывода запроса в отдельном столбце (где ХХХ)?

Т.е. в результате нужно что-то типа:
01.01.2020 | Вася | +7111111 | 2
02.01.2020 | Вася | +7111111 | 2
03.01.2020 | Петя | +7111112 | 1

Вывод содержимого бд:

$sqlall = mysqli_query($link, 'SELECT * FROM `myusers` ORDER BY date ASC;');   	while ($result = mysqli_fetch_array($sqlall)) { 	  echo '<table><tr>' .                    "<td>{$result['date']}</td>" .                    "<td>{$result['name']}</td>" . 	           "<td>{$result['phone']}</td>" . 		   "<td>XXX</td>" . 		   '</tr></table>'; 	}

$sqlall = mysqli_query($link, 'SELECT * FROM `myusers` ORDER BY date ASC;'); while ($result = mysqli_fetch_array($sqlall)) { echo '<table><tr>' . "<td>{$result['date']}</td>" . "<td>{$result['name']}</td>" . "<td>{$result['phone']}</td>" . "<td>XXX</td>" . '</tr></table>'; }

Умные люди, подскажите плиз цельным кодом, типа как в примере выше.
Заранее большое спасибо!

Дополнительно:

Нужно подсчитать именно дубликаты по паре (name, phone)? то есть если номер один, но имена разные - это НЕ дубликаты, и не должны подсчитываться?

  • Нет, можно и без пары, т.е. только по номеру телефона
  • Ну тогда alexalexes уже ответил.
  • Ответы:

    Если у вас MySQL 8, то дубликаты телефонов можно найти тривиально:

    select A.*   from (SELECT `date`, `name`, phone, count() over (partition by phone) phone_count         FROM `myusers` ) A where A.phone_count > 1 ORDER BY date ASC

    select A.* from (SELECT `date`, `name`, phone, count() over (partition by phone) phone_count FROM `myusers` ) A where A.phone_count > 1 ORDER BY date ASC

    Если MySQL 5, то придется немного по сложнее:

    select `date`, `name`, phone, p.phone_count from `myusers` as mu join (SELECT phone, count(*) phone_count          FROM `myusers`          group by phone) p on p.phone = mu.phone where p.phone_count > 1 ORDER BY mu.date ASC

    select `date`, `name`, phone, p.phone_count from `myusers` as mu join (SELECT phone, count(*) phone_count FROM `myusers` group by phone) p on p.phone = mu.phone where p.phone_count > 1 ORDER BY mu.date ASC

    • alexalexes , подскажите, а зачем джойн вместо обычного GROUP BY:
      SELECT `date`, `name`, `phone`, COUNT(`date`) as `count_phone`  GROUP BY `phone` HAVING COUNT(`date`) > 1

      SELECT `date`, `name`, `phone`, COUNT(`date`) as `count_phone` GROUP BY `phone` HAVING COUNT(`date`) > 1

      ?
      ( у топикстартера не было условия на количество сгруппированных записей, но у Вас было).

      P.S. в COUNT() можно было и `name` запихать, без разницы. Любую колонку, которая не вошла в GROUP BY

    • Михаил Ливач, потому что Error 1055.
    • Михаил Ливач, вы правы, можно одним одноуровневым запросом решить задачу.
      Я редко использую having, так как он не такой гибкий, как вытаскивание нужных параметров из оконных функций.

      Любую колонку, которая не вошла в GROUP BY

      В MySQL по умолчанию доступен режим нестрогого синтаксиса запросов (выкл. ONLY_FULL_GROUP_BY), что позволяет доставать часть уникальных сведений из сгруппированных выборок - я считаю, это вредной практикой (как использование goto в процедурных языках). Нужно честно указывать группируемые атрибуты в group by, а если нужно получать выборки уникальных записей из подгрупп, то классифицировать эти уникальные записи оконным вариантом функции, или использовать подзапрос (как собственно, и представлены варианты в ответе). Во "взрослых" СУБД (postgres, oracle, mssql и т.д.) - это единственные варианты использования group by, если указать лишние атрибуты, которых нет в select - будет ошибка.

      у топикстартера не было условия на количество сгруппированных записей, но у Вас было

      Если вы пытаетесь посчитать что-то неуникальное, то у вас задача рано или поздно переквалифицируется в охоту на дубликаты.

    • alexalexes, понял, спасибо. MySQL изначально был довольно "беззаботен". Давно не приходилось писать сложные запросы руками, сейчас ORM, повсюду.

    group by + count()
    или
    count(distinct())

    • :-D
      Автору вопроса нужно на блюдечке, с голубой каёмочкой, тест SQL запроса...
      Ленивый он, панимаишь?!
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Анна SEO Ответ

    Для подсчета и вывода количества совпадений значения в строке при запросе в MySQL можно воспользоваться функцией COUNT() и оператором GROUP BY. Вот пример запроса на языке SQL:

    SELECT column_name, COUNT(*) AS count FROM table_name
    WHERE column_name = 'значение'
    GROUP BY column_name;

    SELECT column_name, COUNT(*) AS count FROM table_name WHERE column_name = 'значение' GROUP BY column_name;

    В данном запросе замените column_name на название столбца, в котором вы хотите искать значения, table_name на название вашей таблицы, 'значение' на значение, которое вы ищете.

    Например, если у вас есть таблица users с полем name, и вы хотите узнать, сколько раз встречается имя "John" в этом поле, запрос будет выглядеть следующим образом:

    SELECT name, COUNT(*) AS count FROM users
    WHERE name = 'John'
    GROUP BY name;

    SELECT name, COUNT(*) AS count FROM users WHERE name = 'John' GROUP BY name;

    Этот запрос вернет количество совпадений значения "John" в столбце name. Вы можете применить этот подход к любым другим полям и значениям в вашей базе данных.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно