我正在尝试构建一个让我发疯的查询。我不知道从哪里开始解决它,但是在搜索了一下之后,我开始使用子查询。现在,我不确定这是否会解决我的问题,或者如果可以,如何创建一个可以满足我需求的解决方案。
这是我当前表的一个非常简单的视图(称为 tbl_1):
---------------------------------
| row | name | other_names |
|-------------------------------|
| 1 | A | B, C |
| 2 | B | C |
| 3 | A | C |
| 4 | D | E |
| 5 | C | A, B |
---------------------------------
我正在使用的一些项目有多个名称(品牌名称、其他国家/地区的名称、代号等),但最终所有这些不同的名称都指的是同一个项目。我最初是按照以下方式运行搜索查询:
SELECT * FROM tbl_1
WHERE name LIKE '%A%'
OR other_names LIKE '%A%';
哪个会返回第 1 行和第 3 行。但是,我很快意识到我的查询也应该返回第 2 行,因为 A = B = C。我将如何去做这样的事情?我对花哨查询之外的替代建议持开放态度,例如构建另一个表,以某种方式将所有名称组合到一行中,但我认为这样的事情容易出错或效率低下。
此外,我正在使用 InnoDB 运行 MySQL 5.5.23,并使用 PHP 和 Python 编写的其他代码。
谢谢!
2012 年 5 月 26 日更新:
我回到了使用子查询的最初想法,但是当我认为我到达某个地方时,我遇到了一个记录在案的 MySQL 问题,其中查询是从外向内评估的,我的子查询将被评估对于每一行,并且不会在实际的时间内完成。这是我试图做的事情:
SELECT * FROM tbl_1
WHERE name = ANY
(SELECT name FROM tbl_1 WHERE other_names LIKE '%A%' or name LIKE '%A%')
OR other_names = ANY
(SELECT name FROM tbl_1 WHERE other_names LIKE '%A%' or name LIKE '%A%')
它使用示例表返回我想要的内容,但前面提到的 MySQL 问题/错误导致子查询被视为依赖查询而不是独立查询。结果,我无法在我的真实表(约 250,000 行)上测试查询,因为它最终超时。
我已经读到该问题的主要解决方法是使用联接而不是子查询,但我不确定如何将其应用于我正在尝试做的事情。我想得越多,使用 PHP/Python 独立运行子查询并使用结果数组来制作我想要的主查询可能会更好。但是,我仍然认为可能会遗漏一些结果,因为列中的术语不如我的示例好(有些术语是多个单词,有些有括号,其他名称不一定是逗号-分开等)。
或者,我正在考虑构建一个单独的表来构建必要的链接,例如:
| 1 | A | B, C|
| 2 | B | C, A|
| 3 | C | A, B|
但考虑到我正在使用的数据及其存在的非标准化格式,我认为说起来容易做起来难。
我当时强烈考虑的路线是建立一个单独的表,其中包含易于构建的链接(即名称:other_names 的比例为 1:1),因此我不必处理存在于other_names 列。我还可以消除/限制 LIKE 的使用,并要求用户至少知道一个确切的名称,以简化结果并可能提高整体性能。
总之,我讨厌使用我无法控制的输入数据。