当我有一个连接其他两个表的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的新手,非常喜欢一些输入。
答案 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应该非常直接。
我认为根据您提供的信息,表格结构很好。
希望这有帮助。
免责声明:我的语法不准确。