1

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

我的三张桌子

destination:
id_destination, name_destination

keyword:
id_keyword, name_keyword

destination_keyword:
id_keyword, id_destination

最后一个连接来自destination-和keyword 表的id,以便将destination 与关键字相关联。

根据关键字获取目的地的查询将如下所示

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

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

4

3 回答 3

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”。


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

要求只有键列具有相同的名称也是限制性的,因为它需要像“name_keyword”这样不自然的列名,而不是简单的“name”——后缀“_keyword”是多余的,没有增加价值,只是因为你必须拥有它而存在因为您使用的是自然连接。

自然连接几乎不会节省任何输入(并且通常会导致更多的输入)并且对连接类型和名称施加限制并且很脆弱。

他们是要避免的。

于 2013-05-06T18:48:56.140 回答
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

尚未对其进行测试,但如果它不正确,它应该向您展示完成它的方法。

于 2013-05-06T18:06:33.117 回答
0

您可以执行多个 LIKE 语句:

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

或者你可以做一个正则表达式匹配:

Column LIKE 'something|somtthing|whatever'

按匹配数排序的技巧与理解 GROUP BY 子句和 ORDER BY 子句有关。您要么希望对所有事物进行计数,要么希望对某些事物进行计数。因此,对于第一种情况,您只需单独使用 COUNT 函数。在第二种情况下,您使用 GROUP BY 子句来“分组”您想要计算的东西/类别。ORDER BY 应该非常简单。

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

希望这可以帮助。

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

于 2013-05-06T18:20:32.507 回答