@hesy

Как получить элемент в списке которого нет искомого значения?

Есть таблица с данными:
id | value | list

В list хранятся данные вида 111 222 333 444 (как лучше их хранить я не придумал, данные в list постоянно будут увеличиваться, в плоть до тысяч в одной строке, мне кажется это не совсем правильный способ...)

Данные в таблице:
id | value | list
-------------------------
1  |  ...  | 111 222 333
2  |  ...  | 333 444
3  |  ...  | 555 444 333
4  |  ...  | 444 111 333
5  |  ...  | 111 222


Вопрос: как получить одну строку с наименьшим id (то есть id == 2) где в list нет 111?

Пробовал так, но из-за % выводит не совсем корректно.
SELECT * FROM table WHERE list NOT LIKE '%111%' OR NOT NULL ORDER BY id LIMIT 1


Если плохо объяснил, то в list я храню уникальные id юзеров, которые просмотрели контент, таким образом я его помечаю, чтобы больше его не показывать юзеру.
  • Вопрос задан
  • 95 просмотров
Решения вопроса 1
tsklab
@tsklab
Здесь отвечаю на вопросы.
SELECT * FROM table 
  WHERE CONCAT(' ', list, ' ') NOT LIKE '% 111 %'
  ORDER BY id LIMIT 1

Если использовать запятую, как разделитель, например, функция CONCAT_WS, то есть FIND_IN_SET.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
kocherman
@kocherman
Вам надо отделить list в отдельную таблицу.
А условия в выборке ставить финциями агрегирования (погуглите SQL HAVING)
infoblocks           showed             users
                                
id | value      info_id | user_id     id  | name 
-----------     ------- | --------    --- | --------
1  |  ...       111     | 333         111 | 333
2  |  ...       333     | 222         333 | 
3  |  ...       555     | 333         555 | 333
4  |  ...       444     | 333         444 | 333
5  |  ...       111     | 555         111 |
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы