我有一个分区表,我们在分区表table_id(varchar(250))字段(列)中存储用户的首选区域。通过使用\ n,存储在此字段中的值类似于1 2 5 6 1。所以请告诉我,我如何在这个特定专栏中搜索?
答案 0 :(得分:3)
别。你的设计绝对可怕,这就是你首先遇到这个问题的原因。
如果你有一个N-N关系(一个用户可以拥有许多首选区域,而且每个区域都可以被许多用户选择),你需要制作一个带有两个表的外键的中间表。
你需要:
答案 1 :(得分:0)
我不建议对以这种方式存储的数据执行搜索,但如果您遇到困难,可以使用正则表达式完成。
您还必须处理字符串的开始和结束匹配。因此,常规LIKE
无效。
尝试使用此SQL。要搜索号码5
SELECT * FROM `TABLE` WHERE `field` REGEXP '\\n?(5)\\n?';
如果您想使用LIKE
功能进行匹配。可以使用多个规则来完成。
SELECT * FROM `TABLE` WHERE `field` LIKE '%\\n5\\n%' OR LIKE '5\\n%' OR LIKE '%\\n5';
请注意,您必须使用双\
来换取新行。
答案 2 :(得分:0)
最简单的方法是使用LIKE查询,如下所示:
SELECT * FROM `preferred_districts` WHERE `district_id` LIKE '%6%';
要确保它是正确的(因为这也将匹配id 16,26,674等),你必须手动检查它是否正确。在php(dunno,如果你使用它)你可以使用下面的代码段:
$id_field = '1 2 5 6 17';
$ids = explode("\n", $id_field);
if(in_array(6, $ids)) {
echo 'Yup, found the right one';
}
重要虽然上述方法可行,但您的数据库设计并非如此。您应该创建(有时称为)区域和用户之间的数据透视表,如下所示。
(Table 'users_preferred_districts')
user_id | district_id
--------+------------
2 | 1
2 | 17
9 | 21
像这样,检索你想要的记录非常容易......
答案 3 :(得分:0)
我使用了mysql函数FIND_IN_SET(),我通过这个函数得到了想要的结果。
我从本教程中获得了帮助。 http://www.w3resource.com/mysql/string-functions/mysql-find_in_set-function.php