SQL запрос, помощь

193
12 декабря 2017, 20:23

Есть огромная таблица 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';
            }
        }
    }
}
Answer 1

По-хорошему надо менять структуру хранения данных, чтобы убрать перечисления через запятую. Если изменить возможности нет, то попробуйте вот так:

SELECT count(id) FROM table1 WHERE tags REGEXP '^значение[^0-9]+|[^0-9]+значение$|,значение,|^значение$'

READ ALSO
транспонированая матрица - C++

транспонированая матрица - C++

Здравствуйте! В университете начали изучать подпрограммы, пока не могу толком в них разобратьсяЕсть матрица размерностью MxN

240
Помогите решить пример с оператором for [требует правки]

Помогите решить пример с оператором for [требует правки]

Помогите решить этот пример: y=cos(1+cos(2+

196
задание относительного пути c++

задание относительного пути c++

Добрый вечер! Что нужно прописать в поле "аргументы команды", что бы сменить путь на какую нибудь директорию, находящуюся внутри проект и что...

221