mysql - 如何正确使用右连接

标签 mysql sql

表位置

loc_id  loc_name        hier2   hier3   hier4   hier5   hier6   hier7   hier8   hier9   
152675  Castelli        105     109     0       319     14356   152673  152675  0   
14356   Rome            105     109     0       319     14356   0       0       0       
...

表格位置引用

oid     name        loc_id
12      Demo Villa  152675
...

现在我尝试通过输入字符串“caste”来查找用户搜索的一些条目:

SELECT geo.loc_id, geo.loc_name AS name
FROM locations AS geo  
LEFT JOIN locations AS geoh3 ON geo.hier3 = geoh3.loc_id  
LEFT JOIN locations AS geoh4 ON geo.hier4 = geoh4.loc_id  
LEFT JOIN locations AS geoh8 ON geo.hier8 = geoh8.loc_id    
WHERE geo.loc_name LIKE 'caste%'
GROUP BY geo.loc_name

这行得通。我得到了 loc_id 152675 的条目

现在我只想获取我们有对象的那些条目。所以我加入引用表:

SELECT geo.loc_id, geo.loc_name AS name
FROM locations AS geo  
LEFT JOIN locations AS geoh3 ON geo.hier3 = geoh3.loc_id  
LEFT JOIN locations AS geoh4 ON geo.hier4 = geoh4.loc_id  
LEFT JOIN locations AS geoh8 ON geo.hier8 = geoh8.loc_id  
RIGHT JOIN locations_xref AS gx ON geo.loc_id = gx.loc_id 
WHERE geo.loc_name LIKE 'caste%'
GROUP BY geo.loc_name

这行得通。我再次获得了 loc_id 152675 的位置条目,因为有一个引用。

问题

现在用户搜索“rome”。我没有得到任何条目,因为没有直接指向城市“罗马”的对象引用。现有对象引用了罗马的一个地区。

如您所见,地区和城市条目具有层次结构 ID,可用于识别正确的结构。我只是无法让它与引用表一起工作,所以我只得到那些在“罗马”或在罗马的一个地区的对象。

非常感谢任何帮助!

最佳答案

我不太了解您的数据,但乍一看,hier6 似乎包含有关RomeCastelli 之间关系的信息.所以您需要的查询可能看起来或多或少像这样:

SELECT geo.loc_id, geo.loc_name AS name
FROM locations AS geo  
LEFT JOIN locations AS geoh3 ON geo.hier3 = geoh3.loc_id  
LEFT JOIN locations AS geoh6 ON geo.hier6 = geoh6.loc_id  
LEFT JOIN locations AS geoh4 ON geo.hier4 = geoh4.loc_id  
LEFT JOIN locations AS geoh8 ON geo.hier8 = geoh8.loc_id  
RIGHT JOIN locations_xref AS gx ON geo.loc_id = gx.loc_id 
WHERE geoh6.loc_name LIKE 'rome%'
GROUP BY geo.loc_name

关于mysql - 如何正确使用右连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7308363/

相关文章:

php - 使用硬连接查询 mysql

php - 从 MySQL 获取值以检查单选按钮会生成通知

java - 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

mysql - 如何在 phpmyadmin 中创建 MySQL 触发器

mysql - 将文本文件中的数据加载到数据库中的表中

c# - 当不存在时,同一语句中的 MySQL Insert 和 Select 返回 'records'

sql - 在SQLite中合并具有关系的多个数据库

mysql - 无法截断外键约束中引用的表

sql - 当较早时间戳不存在条目时,从 sql 操作中排除行

sql - Oracle 数据库连接字符串 PLSQL 兼容性