Дело в том, что REGEXP принимает в качестве аргумента строку. А как же включить в эту строку переменную? Над этим вопросом я бился пару дней и таки совершил своё маленькое открытие.
Возможно для кого-то это будет само–собой разумеющимся очевидным фактом. Однако Гугл об этом ничего не знает, а во всех мануалах по MySQL в части касающейся REGEXP ничего не написано о том, как же использовать переменную в шаблоне.
Итак, допустим, что существует таблица (readed_table), где одно поле — номер пользователя, а другое — список номеров статей, которые он прочитал. Номера в списке разделены запятыми. Задача — вывести список статей из таблицы articles_table, попутно пометив непрочитанные.
- SELECT articles_table.id, EXISTS(SELECT readed_table.article_id FROM readed_table WHERE readed_table.user_id = '2' AND readed_table.article_id REGEXP CONCAT('(^',articles_table.id,',)|(,',articles_table.id,',)|(,',articles_table.id,'$)')) AS readed FROM articles_table
Собственно открытие состоит в том, чтобы использовать функцию CONCAT, которая возвращает строку. При этом, содержащиеся в этой строке переменные будут заменены на соответствующие значения и REGEXP получит нормальный шаблон, состоящий, как и положено, только из теста. Если не использовать CONCAT, то REGEXP воспримет названия полей не как переменные, а как текст. И переубедить его не представляется возможным. По крайней мере, у меня не получилось.