\ n列中的分隔搜索

时间:2013-09-20 11:08:26

标签: mysql

我有一个分区表,我们在分区表table_id(varchar(250))字段(列)中存储用户的首选区域。通过使用\ n,存储在此字段中的值类似于1 2 5 6 1。所以请告诉我,我如何在这个特定专栏中搜索?

4 个答案:

答案 0 :(得分:3)

别。你的设计绝对可怕,这就是你首先遇到这个问题的原因。

如果你有一个N-N关系(一个用户可以拥有许多首选区域,而且每个区域都可以被许多用户选择),你需要制作一个带有两个表的外键的中间表。

你需要:

  1. 仅提供地区信息的地区表。
  2. 一个只包含用户信息的用户的表格。
  3. 用户使用区号和用户ID作为列和外键约束的首选区域的表。这将确保任何用户都可以通过轻松查询获得无限数量的首选区域。

答案 1 :(得分:0)

我不建议对以这种方式存储的数据执行搜索,但如果您遇到困难,可以使用正则表达式完成。

您还必须处理字符串的开始和结束匹配。因此,常规LIKE无效。

MySQL Regular Expressions

尝试使用此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