2017-01-09 2 views
0

Так что я пытаюсь закодировать PHP-скрипт, но мы просто оставим его в SQL-части вещей, так как именно здесь возникает проблема. У меня есть запрос SELECT *, который следует брать только из строк, где совпадает идентификатор пользователя, и идентификатор значка соответствует их идентификатору пользователя, а затем подчеркиванию. Хотя, он захватывает результаты, которые не следует включать?Запрос MySQL LIKE% ...% query возвращает другие результаты?

Вот мой SQL-запрос:

SELECT * 
FROM `user_badges` 
WHERE `user_id` = 1 
AND `badge_id` LIKE '%1_%' 

Это должно возвращать только значки, которые начинаются/содержат 1_, он захватывает все значки, которые содержат/начинаются с 1_, но это также захват it215. Если я ищу другой идентификатор пользователя, например, свой собственный, он будет захватывать все значки с помощью 3_ И он также захватывает ACH_RoomDecoFurniCount31, что сбивает с толку, потому что оно не содержит 3_. Может быть, есть еще кое-что? Может ли кто-нибудь указать мне в правильном направлении.

+3

Возможный дубликат [? Почему "\ _" (подчеркивание) матч "-" (дефис)] (http://stackoverflow.com/questions/8236818/why -does-underscore-match-hyphen) – baao

+0

_ «Итак, я пытаюсь закодировать PHP-скрипт, но мы просто оставим его в SQL-части вещей, так как именно здесь возникает проблема» _ Thankyou! Вы были бы удивлены, сколько людей этого не делают. –

+0

Это не сработает, если вы можете найти идентификатор пользователя в любом месте, потому что '% 1_%' соответствует '31_abc', а также' 1_abc'. Если вы полностью (и недвусмысленно) не разделите идентификатор пользователя (например, сделаете его «только в начале»?), Вы не сможете получить однозначный ответ. Пересмотрите свой формат идентификатора значка. –

ответ

0

_ также подстановочные в SQL - Заменитель для одного символа

0

_ также символ подстановки. Это означает «любой отдельный символ» (тогда как % - «любая последовательность символов»).

Вы можете избежать/указать, что _ или использовать функцию LOCATE вместо соответствия шаблону.

WHERE badge_id LIKE '%1\_%' 

WHERE locate('1_', badge_id) > 0 
1

Вам нужно бежать _, так как это подстановочный знак. Ваш запрос будет должен быть таким:

SELECT * 
FROM `user_badges` 
WHERE `user_id` = 1 
AND `badge_id` LIKE '%1\_%' 
+0

Приветствия! Работает потрясающе :) – Liam

Смежные вопросы