2

我正在尝试检查单元格中是否存在国家代码country在用户向数据库添加任何内容之前,因此,如果国家代码不存在,他将无法添加任何内容。

我将国家代码存储为逗号分隔值。列类型是 VARCHAR。

"id"    "rtype" "country"
"1"     "0"     "US,UK,SE,CA"
"2"     "1"     "US"
"3"     "2"     "UK"

我运行了以下查询,但这导致没有行。这里哪里出错了?问题是,此查询需要使用逗号分隔值以及单个值运行。

select id, rtype from test where id=1 and country in('US')

预期成绩

id | rType
 1 |   0

select id, rtype from test where id=2 and country in('US')

预期成绩

id | rType
 2 |   0
4

3 回答 3

3

试试这个:

SELECT id, rtype FROM test
WHERE FIND_IN_SET('US', country) > 0

这是该FIND_IN_SET(str,strlist)功能的工作原理:

如果字符串 str 在由 N 个子字符串组成的字符串列表 strlist 中,则返回 1 到 N 范围内的值。字符串列表是由以“,”字符分隔的子字符串组成的字符串。[...] 如果 str 不在 strlist 中或 strlist 是空字符串,则返回 0。

于 2013-10-16T04:26:16.773 回答
1

MySQL 有一个非常好的Set Datatype。它非常高效,最多可以存储 255 个值的 64 个不同成员。我不知道你是否可以改变你的列类型,但它会解决很多问题:

  1. 您的列将是可索引的
  2. 你不会错误地存储重复的值
  3. 它将被非常有效地存储
  4. 无效值将被忽略(或在严格模式下出错)
  5. 尾随空格被删除

您将使用FIND_IN_SET函数进行搜索。

于 2013-10-16T04:34:29.273 回答
0

由于国家代码是逗号分隔的值,所以不能直接使用 in 。你可以喜欢。

select id, rtype from test where country like '%US%'

于 2013-10-16T04:28:31.783 回答