0

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

4

4 回答 4

3

不。您的设计绝对是可怕的,这就是您首先遇到此问题的原因。

当您有 NN 关系时(一个用户可以有许多首选地区,并且每个地区可以被许多用户首选),您需要制作一个中间表,其中包含两个表的外键。

你需要:

  1. 仅包含有关地区信息的地区表。
  2. 包含用户的表,其中仅包含有关用户的信息。
  3. 以区号和用户 ID 作为列和外键约束的用户首选地区表。这将确保任何用户都可以轻松查询无限数量的首选地区。
于 2013-09-20T11:13:34.097 回答
0

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

您还必须处理字符串的开始和结束匹配。所以普通人LIKE是行不通的。

MySQL 正则表达式

试试这个 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 回答