我看到这里有几个不同的线程,关于SQL连接有三个表。我有一个不同的问题,给我带来麻烦。它可能是数据库设计问题,也可能是我没有正确使用连接?
基本上我想从一个名为Transactions的表中获取所有内容,并从Transactions中的两个查找字段中连接两个查找表。问题是查找表中可能不总是有查找结果。这是我的数据库架构:
交易 - 主表我想要来自
的数据属性 - 查找表
Transaction_Type - 查找表
这是我的问题:
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表中添加一般记录似乎也是错误的,因为这会破坏其他几个方面。
有什么建议吗?我很早就可以根据需要更改我的架构?我宁愿以正确的方式做到这一点,而我仍然可以。谢谢!
答案 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