1

我有一个简单的数据库表,它具有以下结构:

Teams       Id_1           Id_2            Id_3 

team_1       A              B                C

team_2       A              B                D

team_3       E              F                D

team_4       X              null            null

team_5       D              A                B

现在我有一个字符串 ID 的示例数组,其值为:A B。我想根据该数据点与数据库的最大匹配来选择团队/团队,例如,匹配的结果应该给我team_1、team_2 和 team_5 作为输出。在 mysql 上执行此查询的有效方法是什么?提前致谢。

4

2 回答 2

1

试试这个。取 ID 字段并用空格(分隔符)填充。用空格填充搜索字符串。然后检查是否可以在填充的搜索字符串中找到填充的 ID。

Select *
From Tbl
Where ' ' + ID_1 + ' ' in ' ' + SearchStr + ' '
   Or ' ' + ID_2 + ' ' in ' ' + SearchStr + ' '
   Or ' ' + ID_3 + ' ' in ' ' + SearchStr + ' '
于 2013-10-03T09:36:01.717 回答
1

假设您想要那些具有最佳匹配的人(因此,如果搜索 [DZ] 它会找到带有 D 的 3 个项目,但由于没有包含将被忽略的 Z,那么可能是这样的(未经测试):-

SELECT *
FROM SomeTable
CROSS JOIN
(
    SELECT MAX(IF(FIND_IN_SET(ID_1, REPLACE("A B", " ", ",")) > 0, 1, 0) + IF(FIND_IN_SET(ID_2, REPLACE("A B", " ", ",")) > 0, 1, 0) + IF(FIND_IN_SET(ID_3, REPLACE("A B", " ", ",")) > 0 > 0, 1, 0)) AS MaxCount
    FROM SomeTable
    WHERE FIND_IN_SET(ID_1, REPLACE("A B", " ", ",")) > 0
    OR FIND_IN_SET(ID_2, REPLACE("A B", " ", ",")) > 0
    OR FIND_IN_SET(ID_3, REPLACE("A B", " ", ",")) > 0
) Sub1
WHERE IF(FIND_IN_SET(SomeTable.ID_1, REPLACE("A B", " ", ",")) > 0, 1, 0) + IF(FIND_IN_SET(SomeTable.ID_2, REPLACE("A B", " ", ",")) > 0, 1, 0) + IF(FIND_IN_SET(SomeTable.ID_3, REPLACE("A B", " ", ",")) > 0 > 0, 1, 0) = Sub1.MaxCount

请注意,如果传递的列表以逗号分隔,则可以避免使用所有替换语句。

于 2013-10-03T09:47:03.770 回答