mariadb 作为LIKE搜索一部分的SQL子查询

gtlvzcf8  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(175)

this Question中,我们学习了使用子查询查找曾经被删除的信息。

我们学习的子查询

SELECT * FROM papers WHERE writer_id IN ( SELECT id FROM writers WHERE boss_id = 4 );

现在,我需要搜索一个表,既搜索该表的列值,也搜索另一个表中由id关联的列值。
这里是相同的表,但是col值包含更多的文本,以供我们“搜索”参考...

writers

| 标识符|姓名|凸毂标识|
| - -|- -|- -|
| 一个|约翰·约诺|2个|
| 2个|比尔·博斯沃思|2个|
| 三个|安迪·锡赛德|四个|
| 四个|汉克·利特尔|四个|
| 五个|亚历克斯·克里斯普|四个|
writerspapers他们写...

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%') );
1u4esq0p

1u4esq0p1#

表达此条件的最佳方式是使用exists的相关查询:

select *
from writers w
where Lower(w.name) like '%is%'
  or exists (
    select * from papers p
    where p.writer_id = w.id and Lower(p.title) like '%is%'
  );

请注意,您不需要在所提供的字符串上使用lower,并且仅当您的排序规则确实区分大小写时才应使用lower,因为使用函数会使搜索 predicate 不可优化。

hec6srdp

hec6srdp2#

既然你想要to return cols from writers (not papers),你应该先选择它们,并在标准中使用论文中的东西

select *
from writers w
where 
   w.name like '%is%'
   or 
   w.id in (select p.writer_id
            paper p
            where p.title like '%is%'
           )

您可以添加LOWER函数(我的sql环境不区分大小写,所以我不需要它们)

相关问题