在MySQL中查询多个条件

在MySQL中查询多个条件,mysql,Mysql,当我有一个连接其他两个表的id的表时,我希望能够查询多个语句 我的三张桌子 destination: id_destination, name_destination keyword: id_keyword, name_keyword destination_keyword: id_keyword, id_destination 其中最后一个连接来自目的地和关键字表的ID,以便将目的地与关键字关联 基于关键字获取目的地的查询如下所示 SELECT destination.name_dest

当我有一个连接其他两个表的id的表时,我希望能够查询多个语句

我的三张桌子

destination:
id_destination, name_destination

keyword:
id_keyword, name_keyword

destination_keyword:
id_keyword, id_destination
其中最后一个连接来自目的地和关键字表的ID,以便将目的地与关键字关联

基于关键字获取目的地的查询如下所示

SELECT destination.name_destination FROM destination
            NATURAL JOIN destination_keyword 
            NATURAL JOIN keyword
            WHERE keyword.name_keyword like _keyword_

可以查询多个关键字吗?比如说,我想获得与列表中所有或部分关键字匹配的目的地
sunny、ocean、fishing
,并按匹配数排序。我将如何前进?我应该重组我的桌子吗?我对SQL有点陌生,非常需要一些输入。

您可以尝试以下方法:

SELECT dest.name_destination, count(*) FROM destination dest, destination_keyword dest_key, keyword key 
WHERE key.id_keyword = dest_key.id_keyword
AND dest_key.id_destination = dest.id_destination
AND key.name_keyword IN ('sunny', 'ocean', 'fishing')
GROUP BY dest.name_destination
ORDER BY count(*), dest.name_destination

还没有测试过,但如果不正确,它应该会告诉您实现它的方法。

您可以尝试以下方法:

SELECT dest.name_destination, count(*) FROM destination dest, destination_keyword dest_key, keyword key 
WHERE key.id_keyword = dest_key.id_keyword
AND dest_key.id_destination = dest.id_destination
AND key.name_keyword IN ('sunny', 'ocean', 'fishing')
GROUP BY dest.name_destination
ORDER BY count(*), dest.name_destination

还没有测试过,但如果不正确,它应该会告诉您实现它的方法。

您可以执行多个类似的语句:

Column LIKE 'value1' OR Column LIKE 'value2' OR ...
或者可以进行正则表达式匹配:

Column LIKE 'something|somtthing|whatever'
按匹配数排序的技巧与理解GROUPBY子句和ORDERBY子句有关。你要么希望每件事都有一次计数,要么希望每件事有一次计数。因此,对于第一种情况,您只需单独使用COUNT函数。在第二种情况下,您使用GROUPBY子句来“分组”您想要统计的某些事物/类别。订购方式应该非常直接

我认为根据你提供的信息,你的表格结构是好的

希望这有帮助


免责声明:我的语法不准确。

您可以执行多个LIKE语句:

Column LIKE 'value1' OR Column LIKE 'value2' OR ...
或者可以进行正则表达式匹配:

Column LIKE 'something|somtthing|whatever'
按匹配数排序的技巧与理解GROUPBY子句和ORDERBY子句有关。你要么希望每件事都有一次计数,要么希望每件事有一次计数。因此,对于第一种情况,您只需单独使用COUNT函数。在第二种情况下,您使用GROUPBY子句来“分组”您想要统计的某些事物/类别。订购方式应该非常直接

我认为根据你提供的信息,你的表格结构是好的

希望这有帮助


免责声明:我的语法不准确。

关键字开始对表联接进行排序,并使用目标联接的时间计数:

select
    d.id_destination,
    d.name_destination,
    count(d.id_destination) as matches
from keyword k
join destination_keyword dk on dk.keyword = k.keyword
join destination d on d.id_destination = dk.id_destination
where name_keyword in ('sunny', 'ocean', 'fishing')
group by 1, 2
order by 3 desc
此查询假设
name\u关键字
值是像“sunny”这样的单个单词


使用自然联接不是一个好主意,因为如果表结构发生变化,使得两个自然联接的表被更改为添加了同名的列,那么您的查询将突然停止工作。另外,通过显式声明连接条件,代码的读者将立即了解表的定义,并可以根据需要修改它以添加非键条件

要求只有键列共享相同的名称也是有限制的,因为它需要非自然的列名,如“name\u keyword”,而不是简单的“name”-后缀“\u keyword”是多余的,不会增加任何值,并且只存在于您必须拥有它的情况下,因为您使用的是自然联接

自然连接几乎不保存任何类型(通常会导致更多的类型),并对连接类型和名称施加限制,因此很脆弱


必须避免它们。

以关键字
开始对表联接进行排序,并使用目标联接的时间计数:

select
    d.id_destination,
    d.name_destination,
    count(d.id_destination) as matches
from keyword k
join destination_keyword dk on dk.keyword = k.keyword
join destination d on d.id_destination = dk.id_destination
where name_keyword in ('sunny', 'ocean', 'fishing')
group by 1, 2
order by 3 desc
此查询假设
name\u关键字
值是像“sunny”这样的单个单词


使用自然联接不是一个好主意,因为如果表结构发生变化,使得两个自然联接的表被更改为添加了同名的列,那么您的查询将突然停止工作。另外,通过显式声明连接条件,代码的读者将立即了解表的定义,并可以根据需要修改它以添加非键条件

要求只有键列共享相同的名称也是有限制的,因为它需要非自然的列名,如“name\u keyword”,而不是简单的“name”-后缀“\u keyword”是多余的,不会增加任何值,并且只存在于您必须拥有它的情况下,因为您使用的是自然联接

自然连接几乎不保存任何类型(通常会导致更多的类型),并对连接类型和名称施加限制,因此很脆弱


他们应该被避免。

我认为OP想要做一场类似的比赛。所以,你的解决方案不会像LIKE在中不起作用一样起作用。@NabheetSandhu嗯,检查他标记为正确的答案似乎他不需要LIKE。我认为OP想要做一个LIKE匹配。所以你的解决方案不会像在中那样有效。@NabheetSandhu好吧,检查他标记为正确的答案似乎他不需要这样的答案。
name\u关键字
值像“sunny”这样的单字吗?它们是单字,是的。
name\u关键字
值像“sunny”这样的单字吗?它们是单字,是的。谢谢,这很有效。考虑到我是从几行中提取并比较它们,我不确定。是否也可以显示单独的匹配项?还要选择匹配的关键字,如“阳光”、“海洋”。-而且,
name\u关键字
是一个单词,是的。谢谢,效果很好。考虑到我是从几行中提取并比较它们,我不确定。是否也可以显示单独的匹配项?还要选择匹配的关键字,如“阳光”、“海洋”。-而且,
name\u关键字
是一个单词,是的。