Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Подсчет и вывод совпадений
 
 автор: Beatus   (16.02.2011 в 06:35)   письмо автору
 
 

здравствуйте.
Подскажите каким запросом можно сделать подсчет количества совпадений по полю name.

id | name
1 | Александр
2 | Виктор
3 | Евгений
4 | Виктор
5 | Алексей
6 | Михаил
7 | Виктор
8 | Евгений

Запрос должен вывести число 2, т.к. имеется два совпадения (Виктор и Евгений).

И каким запросом можно получить все ID, где есть совпадения?

Виктор:
ID: 2
ID: 4
ID: 7

Евгений:
ID:3
ID:8

  Ответить  
 
 автор: Trianon   (16.02.2011 в 07:49)   письмо автору
 
   для: Beatus   (16.02.2011 в 06:35)
 

как-то так:
SELECT COUNT(*) AS res
FROM 
(
  SELECT name, COUNT(name) AS cnt 
    FROM tbl 
    GROUP BY name
    HAVING COUNT(name) > 1
) AS t 

  Ответить  
 
 автор: Beatus   (16.02.2011 в 09:00)   письмо автору
 
   для: Trianon   (16.02.2011 в 07:49)
 

Спасибо
вроде подсчет работает нормально
а не подскажете каким запросом можно получить все ID, где есть совпадения?

вывод в таком виде

Виктор:
ID: 2 
ID: 4 
ID: 7 

Евгений: 
ID: 3 
ID: 8

  Ответить  
 
 автор: Trianon   (16.02.2011 в 09:57)   письмо автору
 
   для: Beatus   (16.02.2011 в 09:00)
 

>а не подскажете каким запросом можно получить все ID, где есть совпадения?

Можно поступить следующим образом.
Взять внутренний запрос и соединить его (JOIN) по полю name ( USING(name) ) с копией исходной таблицы.

>вывод в таком виде

SQL выдает данные в виде прямоугольных таблиц.
В затребованном виде данные придется укладывать уже на уровне приложения.

  Ответить  
 
 автор: Beatus   (16.02.2011 в 19:08)   письмо автору
 
   для: Beatus   (16.02.2011 в 06:35)
 

вот вроде написал запросик.


<?php
$sql_name 
mysql_query("SELECT name, count(name) AS cnt FROM users WHERE name !='' GROUP BY name HAVING COUNT(name)>=2");
if(
mysql_affected_rows() < 1){
echo 
'Совпадений не найдено!';
}else{
while(
$name mysql_fetch_assoc($sql_name)){
$name_user htmlspecialchars(trim($name['name']));
$col abs(intval($name['cnt']));
echo 
'<div class="p">
<b>Имя: '
.$name_user.'</b> ['.$col.']<br/>';
$sql_user mysql_query("SELECT * FROM users WHERE name='$name_user' ORDER BY id");
while(
$user mysql_fetch_assoc($sql_user)){
echo 
'ID: '.$user['id'].'<br/>';
}
}
}
?>


Не подскажете как искать совпадения по двум полям?


id | name | phone
1 | Александр | 777777
2 | Виктор | 555444
3 | Евгений | 228833
4 | Виктор | 454454
5 | Алексей | 223885
6 | Михаил | 664488
7 | Виктор  | 990088
8 | Евгений |228833


должно вывести запросом так:

Имя: Евгений Тел.: 228833 [2]
ID:3 
ID:8

  Ответить  
 
 автор: Trianon   (16.02.2011 в 19:11)   письмо автору
 
   для: Beatus   (16.02.2011 в 19:08)
 

WHERE name = 'Евгений' AND phone = '228833'
если Вы про это.

  Ответить  
 
 автор: Beatus   (16.02.2011 в 19:18)   письмо автору
 
   для: Trianon   (16.02.2011 в 19:11)
 

Нет. Вы не поняли.

В этом запросе ищу совпадения по полю name:

<?
$sql_name 
mysql_query("SELECT name, count(name) AS cnt FROM users WHERE name !='' GROUP BY name HAVING COUNT(name)>=2");
?>


Как там добавить ещё и поиск совпадений по полю phone (т.е. по name && phone)?

  Ответить  
 
 автор: cheops   (16.02.2011 в 19:21)   письмо автору
 
   для: Beatus   (16.02.2011 в 19:18)
 

Можно попробовать ввести именнованный ключ по двум полям и подставлять его имя в count().

  Ответить  
 
 автор: Beatus   (16.02.2011 в 19:23)   письмо автору
 
   для: cheops   (16.02.2011 в 19:21)
 

Можно на примере?
А то со сложными запросами я неочень хорошо работаю

  Ответить  
 
 автор: cheops   (16.02.2011 в 19:31)   письмо автору
 
   для: Beatus   (16.02.2011 в 19:23)
 

Нет, погорячился, с именованным индексом COUNT() работать не будет.

  Ответить  
 
 автор: Trianon   (16.02.2011 в 19:22)   письмо автору
 
   для: Beatus   (16.02.2011 в 19:18)
 

GROUP BY name, phone
?

  Ответить  
 
 автор: Beatus   (16.02.2011 в 19:24)   письмо автору
 
   для: Trianon   (16.02.2011 в 19:22)
 

точно, как то не додумался =)
спасибо вроде работает

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования