mysql - 使用三向连接的 SQL 查询

标签 mysql sql join

我看到这里有一些关于 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/

相关文章:

mysql - 无法删除唯一约束

mysql - 有没有办法将表的结构(字段但没有数据)复制到 MySQL 中的新表?

Mysql Foreach 从一个表到另一个表第 2 部分

mysql - MySQL 中的复杂 SELECT 查询

c# - DbContext(DbConnection, bool) 拒绝访问

mysql - 将 IN 子查询的结果插入到单独的列中

sql - 在多对多联结表中强制执行唯一行

sql - UTC 时间到本地时区(中部时间)转换 MS SQL Server

sql - 左连接和左外连接有什么区别?

php - 过滤过去24小时的sql查询