MySQL синтаксис поиска через запятую - PullRequest
0 голосов
/ 23 ноября 2011

Я использую MySQL.В одном из атрибутов таблицы у меня есть описание серийного номера, например, «SM, ST, SK» для одного устройства.

Когда пользователи вводят SM, ST или SK, я хочу, чтобы мой запрос возвращал результат

Мой текущий запрос выглядит так:

SELECT CONCAT(lvl1_id,',',lvl2_id)
FROM hier_menus
LEFT JOIN labels ON (hier_menus.id=label_id AND tbl=65 AND fld=2 AND lang_id=5)
WHERE
hm_type=13 AND lvl1_id=141 AND lvl2_id=id AND label='".addslashes($serial)."'";

Он может толькопосмотрите на первую часть запятой в колонке с серийным номером.Когда пользователи вводят ST, он ничего не возвращает.

Можно ли выполнить поиск по всей длинной строке "SM, ST, SK", чтобы получить соответствующую строку?

Ответы [ 2 ]

1 голос
/ 23 ноября 2011
mysql> select find_in_set('SK', 'SM,ST,SK');
+-------------------------------+
| find_in_set('SK', 'SM,ST,SK') |
+-------------------------------+
|                             3 | 
+-------------------------------+
1 row in set (0.00 sec)

mysql> select find_in_set('SP', 'SM,ST,SK');
+-------------------------------+
| find_in_set('SP', 'SM,ST,SK') |
+-------------------------------+
|                             0 | 
+-------------------------------+

Вы ищете find_in_set,
однако это не оптимизирующее решение

вы должны попытаться нормализовать ваш серийный номер в другой таблице,
где каждый SM, ST и SK хранится как одна строка

другой способ - преобразовать тип данных в set

0 голосов
/ 23 ноября 2011

Попробуйте FIND_IN_SET():

SELECT ... WHERE FIND_IN_SET($serial, label)

и, как указал ajreal, не используйте аддлэш. используйте mysql_real_escape_string (или что-либо, что предоставляет ваша библиотека абстракций БД). Аддлэш безнадежно сломан и позволит кому-то с легкостью атаковать вашу базу данных.

...