Можно ли подсчитать количество элементов в поле, разделенных запятой?

Avenus

Under Glory Yield
Можно ли подсчитать количество элементов в поле, разделенных запятой?

Подскажите, можно ли подсчитать количество элементов в поле таблицы, если они разделены запятыми, но поле не является типом SET, т.к. элементов бывает больше 64?

К, примеру, в таблице 2 поля: id,nums
в nums хранится 42 элемента: 1,13,25,12,6,34...
Можно ли сделать запрос select, который подсчитает количество и выдаст 42?

Спасибо всем, кто отзовется!
 

Фанат

oncle terrible
Команда форума
поместить эти элементы в отдельную таблицу, в столбец.
 

Avenus

Under Glory Yield
***** в смысле?
Т.е. в отдельную таблицу записать 42 элемента?
 

Avenus

Under Glory Yield
Т.е. 42 строки записывать. Если так, то не пойдет...
Эффективнее будет запрос сделать в массив и подсчитать размер массива... А потом уже использовать это число в своих целях...
 

Avenus

Under Glory Yield
Еще такого не делал ни разу, буду пробовать. Спасибо, Alexandre!
 

Gas

может по одной?
Alexandre
человеку бы нормализацию осилить, а тут udf-функции :)
 

Avenus

Under Glory Yield
Так я не против, только я не понял, что он имел ввиду в столбик?
 

Gas

может по одной?
Вместо таблицы вида
1 :: 3,12,45
2 :: 4,7

нужно сделать таблицу
id | nums
1 | 3
1 | 12
1 | 45
2 | 4
2 | 7

Т.е. 42 строки записывать. Если так, то не пойдет...
да хоть 1042
 

Avenus

Under Glory Yield
Мне не очень хотелось делать так:

$nums=@mysql_fetch_assoc(mysql_query('select nums from T1 where id="'.$id.'"' limit 1'));
$list=mysql_query('select * from T2 where id in ("'.$nums['nums'].'")');
...
Чтобы знать сколько строк я выбрал из T2 по такому варианту я сделал бы $total=count($nums);

Так вот я и решил создать тему здесь, чтобы узнать можно ли как то сразу из базы подсчиать $total...
:)
 

Gas

может по одной?
select count(*) from T2 where id =1 group by id;
вот и количество получили для id=1
 

Avenus

Under Glory Yield
Gas, ты смеешься что ли? Я же говорю, не пойдет делать в строки... т.к. этих строк за 1 мин набежит 1000...
 

Avenus

Under Glory Yield
Gas, т.е., ты считаешь, что это нормально? Если, в принципе, очищать потом каждые сутки по cron, то можно и так :)

-~{}~ 15.04.08 22:39:

Ситуация такая, что перед этими запросами есть другие операции, при которых выбираются много id из таблицы и я их записываю в другую таблицу как написал поле nums через запятую...
Если записывать их через цикл из большого количества все в столбик, то думаю накладно будет для сервера?
 

Gas

может по одной?
ты считаешь, что это нормально
в общем случае да, но если действительно добавлений сотни тысяч и более в день, то можно отойти от канонов :) например, ввести дополнительное поле, в котором хранить количество.

-~{}~ 15.04.08 21:43:

записывать их через цикл
1. есть синтаксис insert ... values(),(),(),()...
2. есть синтаксис insert into ... select from
3. так-как полной задачи я не знаю, то всё равно мои советы будут на уровне домыслов, но не уверен что если ты и распишешь всё до мелочей - кто-то решит окунуться вглубь задачи и всё расписать по правильному :)
 

Avenus

Under Glory Yield
О, e-мое! :)
Вот об этом я и не догадался сразу... так и сделаю, добавлю поле с количеством...
Gas, спасибо, за наведение на правильную мысль!
 

Alexandre

PHPПенсионер
человеку бы нормализацию осилить, а тут udf-функции
зачем UDF можно и простой функцией, что-то типа:
Код:
create function count_znak   ( instr varchar(255)) returns int
begin 
   declare pos int; 
   declare count_res=-1;
     set str = instr;
      repeat
           set pos = positiion (  ',', str );
            set str = substring(str, pos+1);
            set count_res = count_res+1;
      until pos > 0 end repeat;

   return count_res;
end;
код составлен налету, возможны ошибки ... ;)

-~{}~ 16.04.08 08:08:

а вообще правильно, от задачи все зависит...
возможно, здесь нормализация должна быть.
 
Сверху