检查字符串是否在MySQL字段值中

时间:2011-05-08 17:57:34

标签: php mysql sql

我有一个名为'colors'的数据库字段,我存储了人们最喜欢的颜色。这些是从多选字段中选择的,我将它们全部存储在一个字段中。我使用PHP来获取一个字段中的所有值:

$lookfor = implode(",", $looking_for);

在包含红色,蓝色,黄色格式值的字段中搜索字符串的最佳方法是什么....

由于用户将使用相同的多选框,我仍然需要以此格式访问值。 我尝试使用

SELECT * 
  FROM users 
 WHERE users_looking_for LIKE '%$lookfor%'

但如果我的值的存储顺序与搜索的顺序不同,则无效。

4 个答案:

答案 0 :(得分:8)

短期解决方案

使用FIND_IN_SET function

$query = sprintf("SELECT u.* 
                    FROM USERS u
                   WHERE FIND_IN_SET('%s', u.users_looking_for) > 0", 
                  mysql_real_escape_string($lookfor));

如果要搜索多个lookfor值,则需要添加其他FIND_IN_SET检查:

WHERE FIND_IN_SET('value1', u.users_looking_for) > 0
  AND FIND_IN_SET('value2', u.users_looking_for) > 0

长期解决方案

不存储非规范化数据 - 使用多对多表设置:

个人

  • people_id(主键)

颜色

  • color_id(主键)

PEOPLE_COLORS

  • people_id(主键,PEOPLE.people_id的外键)
  • color_id(主键,COLORS.color_id的外键)

答案 1 :(得分:0)

但如果我的值的存储顺序与搜索的顺序不同,则无效。

在存储之前对它们进行排序,并在搜索之前对它们进行排序。

答案 2 :(得分:0)

您应该使用包含两个字段的表user_colors:“user_id”和“color”

搜索值会更容易。

示例:

SELECT * FROM user_colors WHERE color='red' OR color='blue';

答案 3 :(得分:0)

我建议不要使用VARCHAR字段来保存所选颜色的列表,而是转向更多的关系方法,其中列出了每个用户的每种颜色。这样,当您执行查询时,您可以说出它是一组值的选择。