【问题标题】:Simple query for getting max value for each entity获取每个实体的最大值的简单查询
【发布时间】:2021-06-10 11:09:07
【问题描述】:

使用 MySQL 数据库在 C# 中开发应用程序。它涉及奶牛及其体重。在表格中显示奶牛的详细信息时,我想显示所有动物的详细信息以及它们的最后体重。

我有两个用于此目的的表格:'Cattle' 和 'Weights'。每只动物都有一个唯一的 ID,该 ID 用作重量表中的外键以及拍摄日期和重量。到目前为止,我这样做的方式是在权重表中获取 MAX(Date) 并使用左连接,但是如果在该日期没有对动物进行称重,那么它将不包括在内。我可以使用每只动物的最大重量(体重),但有些动物可能会因疾病等原因体重下降。

SELECT Cattle.TagNumber,
       Cattle.HerdNumber,
       Cattle.Breed,
       Cattle.DOB,
       Cattle.Group,
       Weights.Weight
FROM Cattle
LEFT JOIN Weights ON Cattle.TagNumber = Weights.TagNumber
WHERE Cattle.Group = '" + group + "'
AND Date = '" + date.ToString("yyyy/MM/dd") + "'";

上面的查询是我在按动物组过滤数据时使用的。我知道我可以单独检查每只动物并获得它们的 MAX(重量),但这会严重影响性能。

【问题讨论】:

  • 不要将查询与数据连接,使用适当的参数化查询如果 group' TRUNCATE TABLE Cattle; /* 会发生什么?
  • 是的,我同意。在了解 SQL 注入黑客之后,立即将我的所有查询更改为参数化查询。感谢您的建议!
  • 为什么权重在一个单独的表格中?还是该查询中未显示某些内容?
  • 每只动物可以有多个重量,因此重量与动物编号和拍摄日期一起保存在另一个表格中

标签: c# mysql winforms


【解决方案1】:

如果您选择在连接中找到的 Max(Date),而不是搜索特定的 Date(Where 子句),您将始终得到结果。不确定这是否是所要求的。

SELECT Cattle.TagNumber,
       Cattle.HerdNumber,
       Cattle.Breed,
       Cattle.DOB,
       Cattle.Group,
       Weights.Weight,
       MAX(Date)
FROM Cattle
LEFT JOIN Weights ON Cattle.TagNumber = Weights.TagNumber
WHERE Cattle.Group = '" + group + "'
Group by Cattle.TagNumber;

编辑

查询还应该返回没有权重的值;你只需要过滤数据。您可以使用 Case(它可能与我写的完全不一样,但可以使用它)。缺少End;您也可能需要将 weight 转换为 nvarchar(或您选择的),否则在 NAMECOLUMN 列中插入 weight 时会出错

SELECT Cattle.TagNumber,
       Cattle.HerdNumber,
       Cattle.Breed,
       Cattle.DOB,
       Cattle.Group,
       (Case when Weights.Weight is null then 'N/A' Else Convert(nvarchar(max),Weights.Weight) End) as NAMECOLUMN,    
       MAX(Date)
FROM Cattle
LEFT JOIN Weights ON Cattle.TagNumber = Weights.TagNumber
WHERE Cattle.Group = '" + group + "'
Group by Cattle.TagNumber;

【讨论】:

  • 是的,看起来不错。但是,我怎么能包括可能根本没有任何重量的动物呢?只输出“N/A”或类似的东西?
  • 答案已编辑。刚刚意识到当我编辑答案时,其他人不会收到通知
  • 刚刚尝试查询,我收到以下错误:#1064 - 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 6 行的 ') as NAME_Column)、MAX(Date) FROM Cattle LEFT JOIN Weights ON Cattl...' 附近使用正确的语法
  • 有一个额外的括号
  • 完成。在浏览器上编写代码,所以end 不见了。另外,检查编辑部分以查看使用转换功能(您可能需要)
猜你喜欢
  • 2010-10-19
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
  • 2018-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多