比较mysql中的两个逗号分隔值并获取匹配的计数

时间:2013-07-26 09:37:45

标签: php mysql sql sql-server-2008 tsql

比较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

2 个答案:

答案 0 :(得分:3)

首先,您列出的数据实际上应该以数据库的每一行存储单个id和单个value的格式存储,即3个元素列表对应3行。如果对您的结构进行了更改,则以下答案将与Compare similarities between two result sets

相关

尽管如此,这里有一个很好的小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

答案 1 :(得分:0)

如果它是SET类型列,您可能可以使用&运算符然后是BIT_COUNT():

BIT_COUNT(values1 & values2)