Подсчет количества phone в уникальных именах - MySQL
Формулировка задачи:
Здравствуйте, есть таблица в которой нужно определить, сколько раз phone встретился в уникальных именах (т.е. без повторов имен). Внимание! Имя Миша повторяется 2 раза.
Я сделал такое с помощью циклов в php, но с большим количеством обращений к БД.
Ответом будет:
02 встретился 3 раза в уникальном имени,
04 встретился 1 раз в уникальном имени,
02 встретился 3 раза в уникальном имени,
02 встретился 3 раза в уникальном имени,
07 встретился 2 раза в уникальном имени,
03 встретился 1 раз в уникальном имени,
02 встретился 3 раза в уникальном имени,
07 встретился 2 раза в уникальном имени.
Можно ли реализовать то же самое, но с условием в самом запросе, ну или хотя бы с помощью 1-2 обращений к БД?
| id | name | phone |
| 1 | Сережа | 07 |
| 2 | Коля | 03 |
| 3 | Даша | 07 |
| 4 | Валя | 02 |
| 5 | Миша | 02 |
| 6 | Лера | 04 |
| 7 | Сара | 02 |
| 8 | Миша | 02 |
$query2 = "SELECT `id`, `name`, `phone` FROM `table` ORDER BY id DESC LIMIT 8"; // Запрос последних 8 id и name
$result2 = mysqli_query($bd_link, $query2);
while ($row2 = mysqli_fetch_assoc($result2)) { // Получаю первый телефон
$array = array(); // Пустой массив
$k = 0; // Счетчик
$query3 = "SELECT `name`, `phone` FROM `table` WHERE phone='".$row2['phone']."'";
$result3 = mysqli_query($bd_link, $query3);
while ($row3 = mysqli_fetch_assoc($result3)) { // Нахожу первое имя
if (!in_array($row3['name'], $array, true)) { // Если нет имени в массиве,
$array[] = $row3['name']; // то записываю в него.
$k++; // Счетчик +1
}
$r[$i]['count'] = "$row2['phone'] встретился $k раз в уникальном имени";
}
unset($array); // Удаляю массив, вроде даже не нужно
mysqli_free_result($result3);
$i++;
}
mysqli_free_result($result2);
print_r($r);Решение задачи: «Подсчет количества phone в уникальных именах»
textual
Листинг программы
SELECT COUNT(NN), NN FROM (SELECT DISTINCT TABLE_NAME.name, TABLE_NAME.phone AS NN FROM TABLE_NAME) GROUP BY NN
Объяснение кода листинга программы
В этом коде используется подзапрос, который выбирает уникальные имена и номера телефонов из таблицы TABLE_NAME. Затем, результаты этого подзапроса группируются по номеру телефона (NN), и для каждой группы подсчитывается количество записей. Затем, итоговое количество записей для каждой группы выводится в результирующем наборе данных.