Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2016, 05:58   #1
Parallelogram
Недотепа
Форумчанин
 
Регистрация: 18.01.2011
Сообщений: 174
По умолчанию Подсчет количества phone в уникальных именах

Здравствуйте, есть таблица в которой нужно определить, сколько раз phone встретился в уникальных именах (т.е. без повторов имен). Внимание! Имя Миша повторяется 2 раза.

id |name |phone
1 | Сережа | 07
2 | Коля | 03
3 | Даша | 07
4 | Валя | 02
5 | Миша | 02
6 | Лера | 04
7 | Сара | 02
8 | Миша | 02

Я сделал такое с помощью циклов в php, но с большим количеством обращений к БД.
PHP код:
$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'], $arraytrue)) { // Если нет имени в массиве, 
            
$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); 
Ответом будет:
02 встретился 3 раза в уникальном имени,
04 встретился 1 раз в уникальном имени,
02 встретился 3 раза в уникальном имени,
02 встретился 3 раза в уникальном имени,
07 встретился 2 раза в уникальном имени,
03 встретился 1 раз в уникальном имени,
02 встретился 3 раза в уникальном имени,
07 встретился 2 раза в уникальном имени.

Можно ли реализовать то же самое, но с условием в самом запросе, ну или хотя бы с помощью 1-2 обращений к БД?
Parallelogram вне форума Ответить с цитированием
Старый 18.04.2016, 07:43   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

если я правильно понял вашу задачу, то достаточно такого запроса:
Код:
select `phone`, `name`, count(*) as cnt from `table` group by `phone`, `name`
Это если я правильно Вас понял.
Потому что мне, например, непонятно, почему у Вас записи дублируются!
Цитата:
Ответом будет:
02 встретился 3 раза в уникальном имени,
02 встретился 3 раза в уникальном имени,
02 встретился 3 раза в уникальном имени,
02 встретился 3 раза в уникальном имени,
p.s. такое тоже можно получить, если Вам вдруг надо именно с дублированием!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.04.2016, 08:22   #3
Parallelogram
Недотепа
Форумчанин
 
Регистрация: 18.01.2011
Сообщений: 174
По умолчанию

Повтор у меня для того, чтобы потом сопоставить к каждой строке количество уникальных повторов. Так:
id |name |phone | repeat
1 | Сережа | 07 | 2
2 | Коля | 03 | 1
3 | Даша | 07 | 2
4 | Валя | 02 | 3
5 | Миша | 02 | 3
6 | Лера | 04 | 1
7 | Сара | 02 | 3
8 | Миша | 02 | 3

У Вас же просто выводится количество совпадений отсортированных по phone

P.s.: еще у меня есть возможность (которая мне необходима) сохранить $array с уникальными именами для каждого phone

Последний раз редактировалось Parallelogram; 18.04.2016 в 08:28.
Parallelogram вне форума Ответить с цитированием
Старый 18.04.2016, 08:36   #4
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,150
По умолчанию

я чет не догоняю.... как может быть УНИКАЛЬНЫЙ ПОВТОР ????
ведь повтор - понятие уже не уникальное...а?
Лучше еще раз сформулируйте четко задание -что вы хотите получить на выходе
ADSoft вне форума Ответить с цитированием
Старый 18.04.2016, 08:38   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

свяжите тот запрос, что я выше указал с исходны запросом по имени и телефону, получите результат тот, что Вам нужен.

p.s. а зачем на каждый телефон ОТДЕЛЬНЫЙ $array - можно же в одном запросе хранить
Код:
[02]
   [Валя]
   [Миша]
   [Сара]
[03]  
   [Коля]
[04]
   [Лера]
[07]
   [Даша]
   [Сережа]
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.04.2016, 09:01   #6
Parallelogram
Недотепа
Форумчанин
 
Регистрация: 18.01.2011
Сообщений: 174
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
я чет не догоняю.... как может быть УНИКАЛЬНЫЙ ПОВТОР ????
ведь повтор - понятие уже не уникальное...а?
Телефон 02 повторился 4 раза, но два из них это Миша. Следовательно повторов 4, а уникальных из них 3 (Миша, Сара, Валя).
Parallelogram вне форума Ответить с цитированием
Старый 18.04.2016, 09:15   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Следовательно повторов 4
Это число даст группировка по полю PHONE

Цитата:
а уникальных из них 3
это даст вышеуказанный запрос с двойной группировкой (по полям PHONE, NAME)


но это всё равно не объясняет, зачем Вам нужно выводить N число ОДИНАКОВЫХ строк:
Цитата:
Ответом будет:
02 встретился 3 раза в уникальном имени,
02 встретился 3 раза в уникальном имени,
02 встретился 3 раза в уникальном имени,
02 встретился 3 раза в уникальном имени,
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.04.2016, 09:18   #8
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,150
По умолчанию

вам не нужна уникальность по имени? тогда может так?
Код:
select `phone`, `name`, count(*) as cnt from `table` group by `phone`
ADSoft вне форума Ответить с цитированием
Старый 18.04.2016, 09:29   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Код:
select phone, count(distinct name) from table group by phone, name
Код:
select phone, count(*) 
from ( select distinct phone, name from table group phone, name )
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 18.04.2016, 11:15   #10
Parallelogram
Недотепа
Форумчанин
 
Регистрация: 18.01.2011
Сообщений: 174
По умолчанию

Я наверно что-то не так делаю. Если делать такой запрос, то выводится как мне ннадо, но без элемента count (где пишется сколько раз из всей базы использовался телефон), тут все верно:
Код:
select `id`, `phone`, `name` from `table` WHERE id <= 8
[0] => Array ( 
	[name] => Сережа 
	[phone] => 7 ) 
[1] => Array ( 
	[name] => Коля 
	[phone] => 3 ) 
[2] => Array ( 
	[name] => Даша 
	[phone] => 7 ) 
[3] => Array ( 
	[name] => Валя 
	[phone] => 2 ) 
[4] => Array ( 
	[name] => Миша 
	[phone] => 2 ) 
[5] => Array ( 
	[name] => Лера 
	[phone] => 4 ) 
[6] => Array ( 
	[name] => Сара 
	[phone] => 2 ) 
[7] => Array ( 
	[name] => Миша 
	[phone] => 2 )
Какой должен быть запрос, чтобы появился элемент count ([name] =>Коля [phone] => 3 [count] => 1 ) равный количеству "уникальных повторов" имен? Следующий запрос не подходит, потому что: 1) делает выборку только из последних 8 строк таблицы; 2) указывает количество повторов имени не так как нужно; 3) сортирует по алфавиту.
Код:
select `id`, `phone`, `name`, count(phone) as cnt from `p_masha` WHERE id < 8 group by `phone`, `name`
[0] => Array ( 
	[name] => Валя 
	[phone] => 2 
	[count] => 1 ) 
[1] => Array ( 
	[name] => Даша 
	[phone] => 7 
	[count] => 1 ) 
[2] => Array ( 
	[name] => Коля 
	[phone] => 3 
	[count] => 1 ) 
[3] => Array ( 
	[name] => Лера 
	[phone] => 4 
	[count] => 1 ) 
[4] => Array ( 
	[name] => Миша 
	[phone] => 2 
	[count] => 2 ) 
[5] => Array ( 
	[name] => Сара 
	[phone] => 2 
	[count] => 1 ) 
[6] => Array ( 
	[name] => Сережа 
	[phone] => 7 
	[count] => 1 )
Должно быть так:
Код:
[0] => Array ( 
	[name] => Сережа 
	[phone] => 7
	[count] => 2 ) 
[1] => Array ( 
	[name] => Коля 
	[phone] => 3 
	[count] => 1 ) 
[2] => Array ( 
	[name] => Даша 
	[phone] => 7 
	[count] => 2 ) 
[3] => Array ( 
	[name] => Валя 
	[phone] => 2 
	[count] => 4 ) 
[4] => Array ( 
	[name] => Миша 
	[phone] => 2 
	[count] => 4 ) 
[5] => Array ( 
	[name] => Лера 
	[phone] => 4 
	[count] => 1 ) 
[6] => Array ( 
	[name] => Сара 
	[phone] => 2 
	[count] => 4 ) 
[7] => Array ( 
	[name] => Миша 
	[phone] => 2 
	[count] => 4 )
Мне кажется расписал все подробно.
Parallelogram вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсчет уникальных значений по условию xamillion Microsoft Office Excel 6 02.04.2015 18:53
подсчет числа уникальных массивов lawliet1391 Помощь студентам 2 28.03.2013 17:28
Подсчет уникальных в дате strannick Microsoft Office Excel 15 03.03.2013 18:59
Не работает подсчет уникальных значений AllenJ Microsoft Office Excel 16 13.10.2012 17:29
подсчет уникальных ячеек с небольшими но... mr.null Microsoft Office Excel 17 21.06.2011 09:21