我看到这里有一些关于 SQL 连接与三个表的不同线程。我有一个不同的问题给我带来了麻烦。这可能是数据库设计问题,或者可能是我没有正确使用连接?
基本上,我想从名为 Transactions 的表中获取所有内容,并从 Transactions 中的两个查找字段连接两个查找表。问题是查找表中可能并不总是有查找结果。这是我的数据库架构:
交易 -- 我想要来自的主表
- 身份证
- Transaction_Type
- Prop_ID
- ...其他不相关字段
属性 -- 查找表
- 身份证
- ...其他不相关字段
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 的交易,这意味着它们属于一般类别 - 不与属性绑定(bind)。
我的问题是我拥有与特性相关的所有这些交易。但有些是针对整个企业的(电话账单、互联网等)。我觉得它们确实应该进入交易表,但它们不会加入到此查询中的属性。同时,在“属性”表中添加常规记录似乎也是错误的,因为这会破坏其他一些事情。
有什么建议吗?我很早就开始了,如果需要的话可以改变我的架构吗?我宁愿在我还可以的时候以正确的方式去做。谢谢!
最佳答案
这可能不是最终的解决方案,但从使用左连接开始
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.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
关于mysql - 使用三向连接的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25473653/