4

我在 MySQL 中有一个表 ITEM,它存储数据如下:

ID    FEATURES
--------------------
1     AB,CD,EF,XY
2     PQ,AC,A3,B3
3     AB,CDE
4     AB1,BC3
--------------------

作为输入,我将得到一个 CSV 字符串,例如“AB,PQ”。我想获取包含 AB 或 PQ 的记录。我意识到我们必须编写一个 MySQL 函数来实现这一点。因此,如果我们在 MySQL 中定义了这个神奇的函数 MATCH_ANY 来执行此操作,那么我将简单地执行如下 SQL:

select * from ITEM where MATCH_ANY(FEAURES, "AB,PQ") = 0

上述查询将返回记录 1、2 和 3。

但是我在实现这个函数时遇到了各种各样的问题,因为我意识到 MySQL 不支持数组并且没有简单的方法来基于分隔符拆分字符串。

改造桌子对我来说是最后的选择,因为它涉及很多问题。

我可能还想执行包含多个 MATCH_ANY 函数的查询,例如:

select * from ITEM where MATCH_ANY(FEATURES, "AB,PQ") = 0 and MATCH_ANY(FEATURES, "CDE")

在上述情况下,我们将得到记录 (1, 2, 3) 和 (3) 的交集,这将是 3。

任何帮助都深表感谢。

谢谢

4

5 回答 5

8

首先,数据库当然不应该包含逗号分隔值,但希望您已经意识到这一点。如果表被规范化,您可以使用如下查询轻松获取项目:

select distinct i.Itemid
from Item i
inner join ItemFeature f on f.ItemId = i.ItemId
where f.Feature in ('AB', 'PQ')

您可以匹配逗号分隔值中的字符串,但这不是很有效:

select Id
from Item
where
  instr(concat(',', Features, ','), ',AB,') <> 0 or
  instr(concat(',', Features, ','), ',PQ,') <> 0
于 2010-05-18T12:18:45.107 回答
5

对于所有 REGEXP 爱好者,我想我会添加这个作为解决方案:

SELECT * FROM ITEM WHERE FEATURES REGEXP '[[:<:]]AB|PQ[[:>:]]';

和区分大小写:

SELECT * FROM ITEM WHERE FEATURES REGEXP BINARY '[[:<:]]AB|PQ[[:>:]]';

对于第二个查询:

SELECT * FROM ITEM WHERE FEATURES REGEXP '[[:<:]]AB|PQ[[:>:]]' AND FEATURES REGEXP '[[:<:]]CDE[[:>:]];

干杯!

于 2015-11-09T04:20:56.793 回答
4
select * 
  from ITEM where 
 where CONCAT(',',FEAURES,',') LIKE '%,AB,%'
    or CONCAT(',',FEAURES,',') LIKE '%,PQ,%'

或创建一个自定义函数来执行您的 MATCH_ANY

于 2010-05-18T12:18:20.160 回答
1

或者,考虑使用 RLIKE()

    select * 
      from ITEM
     where ','+FEATURES+',' RLIKE ',AB,|,PQ,'; 
于 2010-05-18T12:28:24.737 回答
0

只是一个想法:

它必须在SQL中完成吗?这是您通常希望用 PHP 或 Python 或您用来与数据库交互的任何语言编写的那种东西。

这种方法意味着您可以使用所需的任何复杂逻辑构建查询字符串,然后只需提交一个普通的 SQL 查询,而不是尝试在 SQL 中构建一个过程。

于 2010-05-18T12:07:28.550 回答