查询MySQL中的多个条件

时间:2013-05-06 16:56:32

标签: mysql

当我有一个连接其他两个表的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的新手,非常喜欢一些输入。

3 个答案:

答案 0 :(得分:1)

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_keyword值是单个词,例如“sunny”。


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

要求只有密钥列共享相同的名称也是限制性的,因为它需要不自然的列名称,如“name_keyword”而不是简单的“名称” - 后缀“_keyword”是多余的,不添加任何值,只存在因为你的< em>有拥有它,因为你正在使用自然连接。

自然连接几乎不会保存任何键入内容(通常会导致更多键入所有内容)并对连接类型和名称施加限制并且很脆弱。

要避免使用它们。

答案 1 :(得分:0)

您可以尝试以下内容:

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

没有测试过,但是如果它不正确,它应该告诉你完成它的方法。

答案 2 :(得分:0)

您可以执行多个LIKE语句:

Column LIKE 'value1' OR Column LIKE 'value2' OR ...

或者你可以进行正则表达式匹配:

Column LIKE 'something|somtthing|whatever'

按匹配次数排序的技巧与理解GROUP BY子句和ORDER BY子句有关。你要么想要计算一切,要么你想要每件事计算一次。因此,对于第一种情况,您只需使用COUNT函数。在第二种情况下,您使用GROUP BY子句“分组”您想要计算的某些事物/类别。 ORDER BY应该非常直接。

我认为根据您提供的信息,表格结构很好。

希望这有帮助。

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