在this Question中,我们学习了使用子查询查找曾经被删除的信息。
我们学习的子查询:
SELECT * FROM papers WHERE writer_id IN ( SELECT id FROM writers WHERE boss_id = 4 );
现在,我需要搜索一个表,既搜索该表的列值,也搜索另一个表中由id
关联的列值。
这里是相同的表,但是col
值包含更多的文本,以供我们“搜索”参考...
writers
:
| 标识符|姓名|凸毂标识|
| - -|- -|- -|
| 一个|约翰·约诺|2个|
| 2个|比尔·博斯沃思|2个|
| 三个|安迪·锡赛德|四个|
| 四个|汉克·利特尔|四个|
| 五个|亚历克斯·克里斯普|四个|writers
有papers
他们写...
papers
:
| 标识符|职称|编写器标识|
| - -|- -|- -|
| 一个|波斯顿|一个|
| 2个|芝加哥|四个|
| 三个|思科公司|三个|
| 四个|西雅图|2个|
| 五个|北部地区|五个|
我可以用它只搜索writers
上的名字...
仅搜索writers.name
:(不是我想做的)
SELECT * FROM writers WHERE LOWER(name) LIKE LOWER('%is%');
上述搜索的输出:(不是我想做的)
| 标识符|姓名|凸毂标识|
| - -|- -|- -|
| 五个|亚历克斯·克里斯普|四个|
我想从writers
(而不是papers
)返回cols
,但同时在writers.name
和与writers.id
关联的papers.title
中搜索文本。
例如,如果我搜索“is”,我会得到两个:
*Alex Crisp(代表名称“Crisp”中的“is”)
*Andy Seaside(因为Andy写了一个paper
,标题“Cisco”中包含“is”)
“is”搜索的输出:
| 标识符|职称|编写器标识|
| - -|- -|- -|
| 2个|芝加哥|四个|
| 四个|西雅图|2个|
以下是我有什么不工作:
SELECT * FROM papers WHERE LOWER(title) LIKE LOWER('%is%') OR writer_id ( writers=writer_id WHERE LOWER(name) LIKE LOWER('%$is%') );
2条答案
按热度按时间1u4esq0p1#
表达此条件的最佳方式是使用
exists
的相关查询:请注意,您不需要在所提供的字符串上使用
lower
,并且仅当您的排序规则确实区分大小写时才应使用lower
,因为使用函数会使搜索 predicate 不可优化。hec6srdp2#
既然你想要
to return cols from writers (not papers)
,你应该先选择它们,并在标准中使用论文中的东西您可以添加LOWER函数(我的sql环境不区分大小写,所以我不需要它们)