我是mysql和php新手,所以我不知道怎么做。我读了很多关于模式匹配的书,但是我不知道如何用我所读的来解决我的问题。
我有一个数据库,在第1列有一个特定的代码,在第2列有这个代码的含义。下面是一个例子:

+---------------+-----------+
| Code          | Meaning   |
+---------------+-----------+
| A5-B10-C11-D3 | object 1  |
| A5-B10-C50-D8 | object 2  |
| A6-B10-C11-D7 | object 3  |
| A2-B10-C11-D9 | object 4  |
| A5-B19-C11-D7 | object 5  |
| A1-B10-C50-D8 | object 6  |
+---------------+-----------+

我要做的是使用选项进行搜索,通过选择下一个模式来搜索第一列:
从(x…)开始-用户将键入A5,它将获得对象1、2和5
以(..x)结尾-用户将键入d7并获得对象3和5
连续包含(x y)-用户将键入a5 b10并获取对象1和2
以任意顺序(x y)包含,但y始终跟在x后面-用户将键入b10 c11,它将获取对象1、3和4或b10 d8,并将获取对象2和6
两者都包含,但没有顺序-y可以在x之前或之后出现-用户将键入d7 a5并获得对象5。
这就足够开始了。当然,这些代码将更加复杂——例如,b10-b10-a1-d15-c8,但是搜索选项将覆盖所有模式。
提前谢谢你。如果我不清楚我想要什么,请告诉我,以便我可以进一步解释或给出更多的例子。
增加:
单独一行中每个代码部分(A5、B10等)的解决方案对我不起作用。
在我的情况下,这将有更实际的解决方案:
 +-----------+-----------+-----------+-----------+-----------+
 | 1st place | 2nd place | 3rd place | 4th place | Meaning   |
 +-----------+-----------+-----------+-----------+-----------+
 | A5        | B10       | C11       | D3        | object 1  |
 | A5        | B10       | C50       | D8        | object 2  |
 | A6        | B10       | C11       | D7        | object 3  |
 | A2        | B10       | C11       | D9        | object 4  |
 | A5        | B19       | C11       | D7        | object 5  |
 | A1        | B10       | C50       | D8        | object 6  |
 +-----------+-----------+-----------+-----------+-----------+

因此,例如代码A5-B10-C11-D3表示OD对象1。
因此,我的搜索将允许用户通过下一种方法进行搜索并获得后续结果:
无顺序:b10-结果:对象1、2、3、4、6
以:b10开始-结果:无。
结束语:b10-结果:无。
无顺序:A5-B10(或A5 B10,不带短划线)-结果:对象1、2
以:A5-B10(或A5 B10,不带短划线)开头-结果:对象1、2
结束语:A5-B10(或A5 B10,不带破折号)-结果:无。
包含B10-C11(或B10 C11,不带短划线)-结果:对象1、2、4。
等。
这样的事能做吗?

最佳答案

您可以将LIKE用于大多数这些模式匹配。
开始于:WHERE code LIKE 'A5-%'
结束语:WHERE code LIKE '%-D7'
连续包含:WHERE code LIKE '%A5-B10-%
按顺序包含:WHERE code LIKE '%B10-%C11%'
按任意顺序包含:这不能用单个模式完成,请使用ORWHERE code LIKE '%D7-%A5%' OR code LIKE '%A5-%D7%'
除了“以开头”之外,这些方法效率低下,因为它们不能使用索引。如果您的代码具有有意义的结构,那么最好将它们分割成单独的列,您可以显式地搜索这些列。
另一个选项是规范化数据,使每个部分都位于另一个表的单独行中,并带有含义的外键。
Codes

Part_Num    Code    Meaning_ID
1           A5      1
2           B10     1
3           C11     1
4           D3      1
1           A5      2
2           B10     2
3           C50     2
4           D8      2

Meanings
ID  Meaning
1   object 1
2   object 2

然后可以使用以下测试:
WHERE Part_Num = 1 AND Code = 'A5'
WHERE Part_Num = 4 AND Code = 'D7'

对于连续获取代码:
SELECT a.Meaning_ID
FROM Codes AS a
JOIN Codes AS b ON a.Meaning_ID = b.Meaning_ID AND a.Part_Num = b.Part_Num - 1
WHERE a.Code = 'A5' AND b.Code = 'B10';

对于按顺序而不是连续的代码:
SELECT a.Meaning_ID
FROM Codes AS a
JOIN Codes AS b ON a.Meaning_ID = b.Meaning_ID AND a.Part_Num < b.Part_Num
WHERE a.Code = 'B10' AND b.Code = 'C11';

对于任何顺序的代码:
SELECT Meaning_ID
FROM Codes
WHERE Code IN ('D7', 'A5')
HAVING COUNT(*) = 2

使用将代码拆分为行的单独列的新表,可以使用以下命令执行最后一次查询:
WHERE 'D7' IN (1stPlace, 2ndPlace, 3rdPlace, 4thPlace) AND 'A5' IN (1stPlace, 2ndPlace, 3rdPlace, 4thPlace)

10-06 10:38