Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: подсчет фирм в категориях
Покинул форум
Сообщений всего: 33
Дата рег-ции: Окт. 2010
Помог: 0 раз(а)
Здравствуйте, необходимо подсчитать количество фирм в категориях. Одна фирма может быть в нескольких категориях. ID категорий перечислены в поле cat_id в таблице фирм.
SELECT cat.cid, (SELECT COUNT(*) FROM dle_hte_firms as f WHERE f.cat_id REGEXP '[[:<:]]('+cat.cid+')[[:>:]]' AND f.approve = 1) as count FROM dle_hte_firms_category as cat
необходимо примерно таким запросом подсчитать количество... Но вот проблема, как передать cat.cid в регулярное выражение? Если делать как у меня, то не верно считает, если подставить цифру, то верно. Вообще цифры получается на много больше чем на самом деле.
Panoptik
Отправлено: 14 Декабря, 2011 - 22:32:38
Постоянный участник
Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011 Откуда: Одесса, Украина
SELECT cat.cid, (SELECT COUNT(*) FROM dle_hte_firms as f WHERE f.cat_id REGEXP '[[:<:]]('+cat.cid+')[[:>:]]') as count FROM dle_hte_firms_category as cat
SELECT COUNT(*) FROM dle_hte_firms as f WHERE f.cat_id REGEXP '[[:<:]](2)[[:>:]]'
получаем верное 1
Panoptik
Отправлено: 14 Декабря, 2011 - 22:56:59
Постоянный участник
Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011 Откуда: Одесса, Украина
Помог: 131 раз(а)
ваше соотношение между таблицами называется многие ко многим. я в таких случаях предпочитаю пользоваться дополнительной таблицей в которой хранятся отношения между таблицами например из вашего примера содержимое будет примерно такое
id cat_id firm_id
... 1 1
... 1 3
... 1 14
... 1 63
... 2 10
... 2 2
... 2 13
... 2 63
... 3 1
... 3 3
... 3 14
... 3 63
и т. д. работая с промежуточной таблицей находить требуемые значения гораздо проще, хотя наверное это кому как. а ваш изврат с регуляркой в sql наверное прийдется изначально обрабатывать в пхп, хотя если наверняка знать что цифры в ряду "'1,3,14,63'" с двух сторон отделяются запятыми, то вам хватит обыкновенного LIKE '%,3,%'
f.cat_id LIKE '%,cat.cid,%' OR f.cat_id LIKE '%cat.cid,%' OR f.cat_id LIKE '%,cat.cid%'
Этот вариант не учитывает ситуацию когда одно значение типа
(1, '1', 'Фирма 1')
Т.е вариант c LIKE ни как Вам не подходит.
В данной ситуации, я думаю оптимальней все-таки переделать БД, если нет то дергать всю таблицу, и уже PHP считать.
Но это ооочень не оптимально.
dimka888
Отправлено: 15 Декабря, 2011 - 16:46:47
Новичок
Покинул форум
Сообщений всего: 33
Дата рег-ции: Окт. 2010
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.