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

Форум MySQL

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

 

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

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

тема: Подсчитать число вхождений каждой строки
 
 автор: Eugene77   (06.10.2007 в 18:31)   письмо автору
 
 

Ситуация, кажется, очень распространенная.
Надо подсчитать сколько раз входит каждая из строк. $s.
Я делаю это такими запросоми в цикле:


<?
$q
="SELECT * FROM vars WHERE var = '$s'";
$exist mysql_query($q) or exit("Ошибка при проверке наличия строки $s в таблице vars ".mysql_error().'<br>');
switch (
mysql_num_rows($exist)){
    case 
:
        
$n mysql_query('SELECT count(*) FROM vars') or exit("Ошибка при подсчёте строк в таблице vars ".mysql_error().'<br>');
        
$q="INSERT INTO vars VALUES(NULL,'$s',1)";
        
mysql_query($q) or exit("Ошибка при добавлении сроки $s в таблицу vars ".mysql_error().'<br>');
        break;
    case 
:
        
$q="UPDATE vars SET quantity=quantity+1 WHERE var='$s'";
        
mysql_query($q) or exit("Ошибка при увеличении значения числа строк $s в таблице vars ".mysql_error().'<br>');
        break;
    default: exit(
"Переменная $s почему-то найдена в таблице ".mysql_result($exist,0).'  раз');
}

?>

Получается долго.
Можно ли это оптимизировать. Одним запросом сделать?

   
 
 автор: cheops   (07.10.2007 в 10:09)   письмо автору
 
   для: Eugene77   (06.10.2007 в 18:31)
 

Хм... а почему в первом запросе функция COUNT(*) не используется? Она выполняется быстрее, чем выборка результирующей таблицы.

   
 
 автор: Eugene77   (07.10.2007 в 22:08)   письмо автору
 
   для: cheops   (07.10.2007 в 10:09)
 

>Хм... а почему в первом запросе функция COUNT(*) не используется? Она выполняется быстрее, чем выборка результирующей таблицы.

Намного ли? :}
Всё-равно ту же длину дорожки с диска читать...
Или нет?
Ну а мне так было удобней для отладки выводить всё на экран.
Что, стоит исправить? Или пустая возня?

   
 
 автор: cheops   (08.10.2007 в 12:05)   письмо автору
 
   для: Eugene77   (07.10.2007 в 22:08)
 

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

   
 
 автор: Eugene77   (08.10.2007 в 08:29)   письмо автору
 
   для: cheops   (07.10.2007 в 10:09)
 

Мне кажется, что вместо того, чтобы писать весь этот мутный код, до которого я пока только дозрел,
можно сформулировать всего один запрос на основе IGNORE. Тем более, что мой код ещё и не вполне корректен в условиях когда к одной таблице обращается множество параллельных процессов (навствляют лишнего).
Помогите составить грамотный запрос!

   
 
 автор: cheops   (08.10.2007 в 12:08)   письмо автору
 
   для: Eugene77   (08.10.2007 в 08:29)
 

Тогда объясните подробнее, чего вы хотите добиться? Т.е. что у нас на входе, а что должно получаться на выходе? Какую задачу решает скрипт?

   
 
 автор: Eugene77   (08.10.2007 в 18:34)   письмо автору
 
   для: cheops   (08.10.2007 в 12:08)
 

Я думал из моего скрипта это ясне, чем из слов.
Ну, как вам удобнее. ..
В нескольких случаях в одном и том же проекте у меня ситуация, когда я получаю от
клиентов или иным путём строки. Я не знаю наперёд какие они, но мне необходимо их запомнить и получить точное число повторов, если таковые случатся.
Несколько запросов могут поступать к таблице одновременно.

Ну, теперь, я уже начинаю думать, что хочу невозможного
UPDATE INSERT ом не сделаешь...
Как-то это грустно.
Неужели одним запросом задачу нельзя решить?!

   
 
 автор: cheops   (09.10.2007 в 10:22)   письмо автору
 
   для: Eugene77   (08.10.2007 в 18:34)
 

Обязательно напротив каждого из слов хранить количество его вхождений? Может выделить для этого отдельную таблицу?

   
 
 автор: Eugene77   (09.10.2007 в 22:06)   письмо автору
 
   для: cheops   (09.10.2007 в 10:22)
 

>Обязательно напротив каждого из слов хранить количество его вхождений? Может выделить для этого отдельную таблицу?

Я в этом направлении не думал...
Вообще-то не хотелось таблицы плодить... ну в крайнем случае можно.

Я читал, что в mysql можно элиасы и для полей таблиц применить, не только для имён.
Только у меня ещё это никак в голове не уложится. Опыта не хватает. Чтобы сочинить
толковый запрос.

   
Rambler's Top100
вверх

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