比较mysql中逗号分隔的值,并在countcolumn中获取匹配的输出
例子:
id values
1 1,2,3
2 3
3 1,3
通过比较ID 1和2,输出应为1
通过比较ID 2和3,输出应为1
通过比较ID 3和1,输出应为2
首先,您列出的数据实际上应该以一种格式存储,数据库的每一行都存储一个id
和一个value
,即3元素列表将对应3行。如果对您的结构进行了更改,则以下答案将是有意义的。
就目前而言,这是我整合的一个不错的MySQL小功能,可用于您的目的。这将接受2个参数,这些参数是逗号分隔的列表,并将返回出现在列表2中的列表1中的元素数。
这样做并不能防止在列表2中对列表1中的重复ID进行两次计数(即“ 1,1,2”和“
1,2”将返回值3),但是您可以弄清楚如何合理地调整此值如果您愿意,可以轻松地做到这一点。
要使用此功能,只需执行
SELECT
countMatchingElements( '3' , '1,3' ) AS testCase1
countMatchingElements( '1,2,3' , '1,3' ) AS testCase2
countMatchingElements( '3' , '1,2,3' ) AS testCase3;
存储的功能逻辑如下
CREATE DEFINER = `yourUserGoesHere`@`%` FUNCTION `countMatchingElements`(inFirstList VARCHAR(1000), inSecondList VARCHAR(1000))
RETURNS tinyint(3) unsigned
NO SQL
DETERMINISTIC
SQL SECURITY INVOKER
BEGIN
DECLARE numReturn TINYINT UNSIGNED DEFAULT 0;
DECLARE idsInFirstList TINYINT UNSIGNED;
DECLARE currentListItem VARCHAR(255) DEFAULT '';
DECLARE currentID TINYINT UNSIGNED;
SET idsInFirstList = ( CHAR_LENGTH( inFirstList ) + 1 ) - CHAR_LENGTH( REPLACE( inFirstList , ',' , '' ) );
SET currentID = 1;
-- Loop over inFirstList, and for each element that is in inSecondList increment numReturn
firstListLoop: REPEAT
SET currentListItem = SUBSTRING_INDEX( SUBSTRING_INDEX( inFirstList , ',' , currentID ) , ',' , -1 );
IF FIND_IN_SET( currentListItem , inSecondList ) THEN
SET numReturn = numReturn + 1;
END IF;
SET currentID = currentID + 1;
UNTIL currentID > idsInFirstList
END REPEAT firstListLoop;
RETURN numReturn;
END
问题内容: 我想比较具有两个不同Oracle表的逗号分隔值的两列(差异表)的值。我想找到与所有值 都 匹配的行( 所有值都应与值匹配)。 注意:逗号分隔值的顺序不同。 例子: T1: T2: MY RESULT应该仅在两个表中显示基于“所有名称匹配”的匹配行。 尝试过但无法使其正常工作。 我使用下面的代码来解析值: 问题答案: 您可以将表格转换为第一范式,然后比较存储在每一行中的化合物。起点可以是
问题内容: 表格Jobs有2列JobId,保存工作位置时的城市可能是多个城市,如下所示 我想如何在类似城市的城市中计算Jobid想要在纽约市中计算Jobid的结果 纽约3俄亥俄州1弗吉尼亚2 问题答案: 为了获得用逗号分隔的不同值的计数,可以在查询之上运行,但是要获得正确的结果,您应该再使用一个表,该表只有一个列num整数类型,并插入一些值。如果在此情况下在GROUP_CONCAT(城市分隔符’,
我有几个表我需要加入,我不能改变数据库,因为它正在多个不同的应用程序中使用。 第一个表如下所示
问题内容: 我有2张桌子如下 笔记表 职位表 我想查询我的Notes表并将’forDepts’列与Positions表中的值相关联。 输出应为: 我知道数据库应该规范化,但是我不能更改此项目的数据库结构。 这将用于使用以下代码导出excel文件。 此代码仅输出“ forDepts”的第一个值 考试:执行人员(而不是执行人员,公司行政人员,Art) 可以通过CONCAT或FIND_IN_SET完成吗
问题内容: 我正在从存储过程中调用Scalar UDF以获取列值。在标量UDF内,我有一个xml,并且必须获取特定节点的逗号分隔值。我使用了Cross apply,但是它导致了巨大的性能瓶颈,因为存储过程实际上是用来获取报告的。 有一个[旅行者]表,其中包含字段ID,BookingID(可以重复)和FareDetails。在FareDetails内部,我们存储xml。 UDF内部的逻辑如下:第一解
问题内容: 我的一个表中有一列,其中存储多个用逗号分隔的ID。有没有一种方法可以在查询的“ IN”子句中使用此列的值。 column()的值类似于 我需要用作 我对Crozin的回答感到满意,但我愿意接受建议,观点和选择。 随时分享您的观点。 问题答案: 以@Jeremy Smith的FIND_IN_SET()示例为基础,您可以使用联接来完成此操作,因此不必运行子查询。 这是众所周知的非常表现