Есть огромная таблица table1:
id tags
1 ,1,2,3,
2 ,41,26,3,
3 ,1,32,38,
4 ,51,2,3,
5 ,16,2,37,
6 ,17,28,3,
7 ,81,23,3,
8 ,91,12,35,
9 ,12,2,3,
В поле tags хранятся перечисленные через запятую id. Необходимо посчитать количество строк, где встречается tags = 1, например
Сама схема работы на текущий момент следующая, есть несколько вложденных циклов. В первом цикле считается количество строк с LIKE '%,1,%', во втором количество строк с LIKE '%,2,%', и так далее. Циклов очень много. Без LIKE все моментально происходит, с LIKE зависает сервер. Есть альтернативные варианты?
Примерный код:
$query = $this->db->query("SELECT id FROM table1 ORDER BY order ASC");
foreach ($query->result_array() as $key => $result1)
{
$query = $this->db->query("SELECT id FROM table2 WHERE id_table1='".$result1['id']."' ORDER BY order ASC");
foreach ($query->result_array() as $key => $result2)
{
$query = $this->db->query("SELECT id FROM table3 WHERE id_table2='".$result2."' ");
foreach ($query->result_array() as $key => $result3)
{
$query = $this->db->query("SELECT count(id) as count_id FROM table4 WHERE tags LIKE '%,".$result3['id'].",%' AND string1='0' AND string2='1' ");
$res = $query->row_array();
if ($res['count_id'] > 0)
{
echo 'OK';
}
}
}
}
По-хорошему надо менять структуру хранения данных, чтобы убрать перечисления через запятую. Если изменить возможности нет, то попробуйте вот так:
SELECT count(id) FROM table1 WHERE tags REGEXP '^значение[^0-9]+|[^0-9]+значение$|,значение,|^значение$'
Виртуальный выделенный сервер (VDS) становится отличным выбором
Здравствуйте! В университете начали изучать подпрограммы, пока не могу толком в них разобратьсяЕсть матрица размерностью MxN
Помогите решить этот пример: y=cos(1+cos(2+
Добрый вечер! Что нужно прописать в поле "аргументы команды", что бы сменить путь на какую нибудь директорию, находящуюся внутри проект и что...