我有一个区表,其中我们将用户的首选区存储在区表 District_id (varchar(250)) 字段(列)中。使用 \n 存储在此字段中的值类似于 1 2 5 6 1。所以请告诉我,我如何在这个特定的列中搜索?
问问题
56 次
4 回答
3
不。您的设计绝对是可怕的,这就是您首先遇到此问题的原因。
当您有 NN 关系时(一个用户可以有许多首选地区,并且每个地区可以被许多用户首选),您需要制作一个中间表,其中包含两个表的外键。
你需要:
- 仅包含有关地区信息的地区表。
- 包含用户的表,其中仅包含有关用户的信息。
- 以区号和用户 ID 作为列和外键约束的用户首选地区表。这将确保任何用户都可以轻松查询无限数量的首选地区。
于 2013-09-20T11:13:34.097 回答
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';
请注意,您必须使用双精度\
来转义换行。
于 2013-09-20T11:15:52.037 回答
0
最简单的方法是使用 LIKE 查询,如下所示:
SELECT * FROM `preferred_districts` WHERE `district_id` LIKE '%6%';
为确保您收到的是正确的(因为这也将匹配 id 16、26、674 等),您必须手动检查它是否正确。在 php 中(不知道你是否使用它)你可以使用下面的代码片段:
$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
像这样很容易检索你想要的记录......
于 2013-09-20T11:17:11.590 回答
0
我已经使用了 mysql 函数 FIND_IN_SET() 并且通过这个函数得到了想要的结果。
我从本教程中得到了帮助。 http://www.w3resource.com/mysql/string-functions/mysql-find_in_set-function.php
于 2016-11-09T16:21:24.733 回答