SQL语句仅获取表的最新连接条目

时间:2015-11-18 07:50:19

标签: mysql sql

对不好的头衔抱歉,我无法想出更好的......

我只需要一些帮助来制定一个SQL语句。不幸的是我的SQL有点生疏。我附上了一个简化的情况示例(ER模型)。

enter image description here

正如你在那里看到的,我有4张桌子。客户,产品,许可证和支持。 始终为特定产品颁发许可证并将其分配给特定客户。客户可以持有一个或多个许可证。 最初我只想要表Customer,Prodcut和Licenses的组合信息。到目前为止这么好,这很容易,我只需要求

SELECT * 
FROM Customers,
     Product,
     Licenses
WHERE Customers.CustomerID = Licenses.CustomerID
  AND Product.ProductID = Licenses.ProductID

但现在我还需要从Support表中添加一些数据。我想要上一个声明中的每个条目(对于每个许可证)现在还要描述和最后支持案例(如果有的话)的日期,这些案例与相应的LicenseKey相关联(仅限最后一个) LicenseKey不是全部)。 SupportID是一个运行号码,因此可以按此排序。

我知道我也可以询问所有案例,并在我的申请中过滤收到的日期,但不幸的是网络流量应该保持在最低限度。

帮助我Obi-Wan Kenobi ..你是我唯一的希望......

1 个答案:

答案 0 :(得分:1)

如果没有许可证支持案例,请执行LEFT JOIN

NOT EXISTS只返回一个支持案例,只有相同的许可证才有效。

SELECT * 
FROM Customers c
  JOIN Licenses l ON c.CustomerID = l.CustomerID
  JOIN Product p ON p.ProductID = l.ProductID
  LEFT JOIN Support s1 ON s1.LicenseKey = l.LicenseKey
WHERE NOT EXISTS (select 1 from Support s2
                  where s2.LicenseKey = s1.LicenseKey
                    and s2.Date > s1.Date)

注意:现在使用现代显式JOIN语法。如果需要,更容易编写(没有错误),更容易阅读,更容易转换为外部联接。