【问题标题】:self join with inner join on other tables together自联接与其他表上的内部联接在一起
【发布时间】:2017-05-30 21:51:42
【问题描述】:

我有一个包含 3 个表记录、类别、关系的数据库。

records (id, lat, lng)
categories (c_id, c_value)
relational (r_id, c_id)

records
id  | lat      | lng
----------------------
1    23.57258   -35.28412
2    23.54855   -35.18881
3    23.74128   -35.17469

categories
c_id | c_value
---------------
100    groceries
101    bags
102    drinks

relational
id  |  c_id
------------
1     100
1     102
2     101
3     100

relational.r_id = records.id 和relational.c_id = categories.c_id 我想从具有不同 c_value 的记录中获取对,所以我想在记录中进行自我连接,并在类别和关系中进行内部连接。 我在没有自我加入记录的情况下做到了这一点

SELECT id, lat, lng, c_value 
FROM records 
JOIN relational 
  ON records.id = relational.id 
JOIN categories 
  ON relational.c_id = categories.c_id 
WHERE c_value = "V1"  

我尝试了类似的方法,但没有成功。我的 R1.c_value 有问题。

SELECT R1._id, R1.lat, R1.lng, R1.c_value, R2._id, R2.lat, R2.lng, 
       R2.c_value 
FROM records R1, records R2 
JOIN relational 
  ON records.id = relational.id 
JOIN categories 
  ON relational.c_id = categories.c_id 
WHERE R1.c_value = "groceries" AND R2.c_value = "bags"

您知道如何将这 3 个联接结合起来,以便从记录中获取 2 行与其他表的条件吗? 我想要这样的输出: 对于“杂货”和“袋子”作为 c.value

1 | 23.57258  |  -35.28412  |  groceries | 2  | 23.54855  |  -35.18881  |  bags    

【问题讨论】:

  • 在同一个查询中混合使用“comma join”和“join”语法通常是个坏主意……使用“comma join”表示法通常是个坏主意。
  • 我觉得这个问题很难理解。您能否提供一些示例数据以及您尝试获得的结果?

标签: mysql join inner-join self-join


【解决方案1】:

您可以像这样自行加入records 表以及categoriesrelational

SELECT r1.id, r1.lat, r1.lng, r2.id, r2.lat, r2.lng, c.c_value
FROM records r1 JOIN relational rl ON r1.id = rl.r_id
JOIN records r2 ON r2.id = rl.r_id
JOIN categories c ON rl.c_id = c.c_id
WHERE r1.id <> r2.id;

【讨论】:

  • 这对于 1 c_value 看起来不错。如果我希望 r1 中的 c_value 和 r2 中的 c_value 不同,您能帮我查询吗?
  • 在这种情况下,您必须在 categories 表上加入两次并提供不同的值。
  • 你的意思是把c1.c_value, c2.c_value 放在select 然后加入类别c1 on rl.c_id= c1.c_id join categories c2 on rl.c_id= c2.c_id where c1.c_value =“V1”和 c2.c_value =“V2”。我试过了,但它返回空结果。 ://
  • 很抱歉,您能详细解释一下怎么做吗?因为我想不通。
  • 我们在查询中有c.c_value = 'V1';,所以它不能不同。您能否在问题中添加预期输出?
【解决方案2】:

我终于找到了我想要的东西。我的查询应该是这样的。无论如何,感谢您的帮助和想法。

SELECT r1.id, r1.lat, r1.lng, c1.c_value, r2.id, r2.lat, r2.lng, c2.c_value
FROM records r1 JOIN relational rl1 ON rl1.id = r1.id
JOIN categories c1 ON rl1.c_id = c1.c_id
JOIN records r2 JOIN relational rl2 ON rl2.id = r2.id
JOIN categories c2 ON rl2.c_id = c2.c_id
WHERE  c1.c_value = "groceries" AND c2.c_value = "bags"     

【讨论】:

    猜你喜欢
    • 2012-07-19
    • 2019-02-23
    • 1970-01-01
    • 2011-12-09
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    相关资源
    最近更新 更多