比较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
比较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 个参数,它们是逗号分隔的列表,并将返回列表 1 中出现在列表 2 中的元素的数量。
这不会阻止列表 1 中的重复 ID 在列表 2 中被计算两次(即“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
如果它是 SET 类型的列,您可以使用 & 运算符,然后使用 BIT_COUNT():
BIT_COUNT(values1 & values2)