带有三向连接的SQL查询

时间:2014-08-24 16:10:18

标签: mysql sql join

我看到这里有几个不同的线程,关于SQL连接有三个表。我有一个不同的问题,给我带来麻烦。它可能是数据库设计问题,也可能是我没有正确使用连接?

基本上我想从一个名为Transactions的表中获取所有内容,并从Transactions中的两个查找字段中连接两个查找表。问题是查找表中可能不总是有查找结果。这是我的数据库架构:

交易 - 主表我想要来自

的数据
  • ID
  • TRANSACTION_TYPE
  • PROP_ID
  • ......其他不相关的字段

属性 - 查找表

  • ID
  • ......其他不相关的字段

Transaction_Type - 查找表

  • ID
  • ..其他不相关的字段

这是我的问题:

SELECT * FROM `Transactions` 
Join TransactionType on Transactions.Type_ID = TransactionType.ID 
Join Property on Transactions.Prop_ID = Property.ID  
ORDER BY `Transactions`.`ID`  DESC

这给了我99%的我想要的东西。问题是当Transactions.Prop_ID没有匹配的Property.ID时,它不会从Transaction表返回记录。我有一些Prop_ID为0的交易,这意味着它们属于一般类别 - 不依赖于属性。

我的问题是我拥有属性的所有这些交易。除了有一些是针对整个企业(电话费,互联网等)。我觉得他们应该真的进入事务表,但他们不会加入此查询中的属性。同时,在Property表中添加一般记录似乎也是错误的,因为这会破坏其他几个方面。

有什么建议吗?我很早就可以根据需要更改我的架构?我宁愿以正确的方式做到这一点,而我仍然可以。谢谢!

2 个答案:

答案 0 :(得分:0)

它可能不是最终解决方案,但首先使用左连接

SELECT Transactions.*, 
  FROM `Transactions` 
  LEFT JOIN TransactionType on Transactions.Type_ID = TransactionType.ID 
  LEFT JOIN Property on Transactions.Prop_ID = Property.ID  
ORDER BY `Transactions`.`ID`  DESC

这样,Type_ID在TransactionType表中没有匹配的事务将TransactionType.ID显示为NULL,而不是根本不带任何东西。 Property表也是如此。 Property.ID中没有匹配的行将显示Property.ID NULL。

这可以帮助您找到,例如,由于Property或TransactionType中缺少匹配记录而导致您的前一个查询遗漏的每笔交易

SELECT Transactions.*, 
  FROM `Transactions` 
  LEFT JOIN TransactionType on Transactions.Type_ID = TransactionType.ID 
  LEFT JOIN Property on Transactions.Prop_ID = Property.ID  
WHERE (Property.ID is null OR TransactionType.ID is NULL)
ORDER BY `Transactions`.`ID`  DESC

答案 1 :(得分:0)

SQL中的三个表JOIN语法:

SELECT t1.col,t3.col FROM table1 join table2 ON table1.primarykey = table2.foreignkey                                   join table3 ON table2.primarykey = table3.foreignkey