1

Тема: Запрос на выборку записей с помощью LIKE из БД

Есть база данных: users и таблица posts
В этой таблице поля: id, text, id_user, hide_users, id_avtor
И нужно выбрать все записи где в поле id_user присутствует мой id или моих друзей, и где в поле hide_users нет моего id или моих друзей.
То есть вот сам запрос:
56 и 58 - мои друзья
SELECT `id`,`text` FROM `posts` WHERE (`id_user` LIKE '%56%' OR `id_user` LIKE '%58%')  AND `hide_users` NOT LIKE '%56%' AND `hide_users` NOT LIKE '%58%'
И у меня не получается следующие: Если в поле `id_avtor` id есть есть в поле `id_user` то есть `id_user` LIKE '%id_avtor%' то условия `hide_users` NOT LIKE '%56%' AND `hide_users` NOT LIKE '%58%' не должно срабатывать, а если нет такого id в поле id_user то с этими условиями. Возможно ли использовать различные запросы в зависимости от сравнения  `id_user` LIKE '%id_avtor%' без дополнительного  запроса?

2

Re: Запрос на выборку записей с помощью LIKE из БД

По моему, LIKE здесь использовать смысла нет. По пробуйте такой вариант.

SELECT `id`,`text` FROM `posts`
WHERE `id_user` IN(56, 58) 
AND ( `id_user` != `id_avtor` AND  `hide_users` NOT IN(56, 58) );

3 (изменено: vanicon, 2012-03-11 12:55:18)

Re: Запрос на выборку записей с помощью LIKE из БД

По моему, LIKE здесь использовать смысла нет

В поле id_user и в поле hide_users id пользователей прописаны вот так:
,56,.,58,.,59,
Запятые это для пометки начала и конца id и точки это если потом нужно будет перебрать как массив...
Думайте LIKE в таком случае не нужен?

SELECT `id`,`text` FROM `posts`
WHERE `id_user` IN(56, 58)
AND ( `id_user` != `id_avtor` AND  `hide_users` NOT IN(56, 58) );

И в запросе Вы выводите все посты где id_user != id_avtor получается где id_user = id_avtor он не будет выводить

4

Re: Запрос на выборку записей с помощью LIKE из БД

vanicon сказал:

Думайте LIKE в таком случае не нужен?

LIKE найдет и 58 и 158 и 581 и т. д. В таком случае, вместо LIKE надо использовать регулярные выражения.

SELECT `id`,`text` FROM `posts`
WHERE (`id_user` REGEXP "[^,]56[,$]" OR `id_user` REGEXP "[^,]58[,$]")
AND ( `id_user` != `id_avtor` AND  (`hide_users` NOT REGEXP "[^,]56[,$]" OR `hide_users` NOT REGEXP "[^,]58[,$]") );

5

Re: Запрос на выборку записей с помощью LIKE из БД

Вроде бы решил задачу вот таким запросом:

SELECT * FROM `posts` WHERE (`id_user` LIKE '%,56,%' OR `id_user` LIKE '%,54,%') AND (`id_user` NOT LIKE `id_avtor` AND `hide_users` NOT LIKE CONCAT("%,", `id_avtor`) AND `hide_users` NOT LIKE '%,54,%') OR (`id_user` LIKE  CONCAT("%,", `id_avtor`))

Как думайте правильно ли?

6

Re: Запрос на выборку записей с помощью LIKE из БД

LIKE найдет и 58 и 158 и 581 и т. д. В таком случае, вместо LIKE надо использовать регулярные выражения.

Не найдет так как искать я буду не 58 а ,58, я писал что:
В поле id_user и в поле hide_users id пользователей прописаны вот так:
,56,.,58,.,59,
Запятые это для пометки начала и конца id и точки это если потом нужно будет перебрать как массив...

7

Re: Запрос на выборку записей с помощью LIKE из БД

Пробуйте, смотрите что выводит запрос. Меня только этот момент смущает - `id_user` NOT LIKE `id_avtor`
Если в поле `id_user` строка ",58,.,59,", то не понятно что в поле `id_avtor`.

8

Re: Запрос на выборку записей с помощью LIKE из БД

Если в поле `id_user` строка ",58,.,59,", то не понятно что в поле `id_avtor`.

в поле id_avtor нормальный id - он там всего один например 59 и все без запятых...

9

Re: Запрос на выборку записей с помощью LIKE из БД

Тогда надо что-то такое делать.
`id_user` NOT LIKE CONCAT("%,", `id_avtor`, ",%")

Дальше не понятно почему только с одной стороны `id_avtor` запятая указана.
`hide_users` NOT LIKE CONCAT("%,", `id_avtor`)

10

Re: Запрос на выборку записей с помощью LIKE из БД

Да все так, у себя на localhost'e уже это исправил, на форуме вот забыл...

11

Re: Запрос на выборку записей с помощью LIKE из БД

Спасибо Вам Hanut за идею во 2 посте...