【问题标题】:Extension to my MySQL query. Need to compare values from different row and column对我的 MySQL 查询的扩展。需要比较不同行和列的值
【发布时间】:2012-12-11 16:05:46
【问题描述】:

这是我的桌子:

我想从中选择代码和编号,这是我的查询的可视化:

这是查询:

SELECT Code,Number,(1894 - Limit1) AS spread1,(Limit2 - 1894) AS spread2 
FROM MyTable WHERE Name="John" AND 600>=L1 AND 600<=L2 
AND 1894>=Limit1 AND 1894<=Limit2

如图所示,此查询返回两个值,我只需要一个。所以我应该将 row1 中的 spread2row2 中的 spread1 进行比较,并获取更大点差的代码和数量如果是spread2

我为什么要比较 row1 的 spread2 和 row2 的 spread1 是因为它们相互重叠。所以,我正在比较重叠范围内的点差:

通过上面的查询,我只能得到结果只有一两行,永远不会更多。为什么?因为表是这样创建的。如果结果显示一行,我将不需要任何比较,这意味着我只有一个代码和数字。

因此,归根结底,我需要扩展我的查询来执行上述操作。

我尝试的是添加:

ORDER BY (spread2,spread1) DESC LIMIT 1

而且我确信它不会像我想要的那样比较值,而是比较来自同一行的值。

【问题讨论】:

  • 为什么要比较 spread2 和 spread1?如果结果中有 3 行怎么办?此外,take Code and Number of bigger spread 请注意 3006 > 1144 所以你应该返回 3006 的行,对吧?
  • 你的照片对我来说没有意义。你能解释一下吗?
  • 为什么不考虑11443006
  • 试试ORDER BY LEAST(Limit2 - 1894, 1894 - Limit1) DESC LIMIT 1
  • @MostyMostacho 我已经为你更新了我的问题。

标签: mysql


【解决方案1】:

解决了!

对于 Value1 = 600 和 Value2 = 1894:

SELECT number,code,(spread2)AS spread FROM(SELECT number,code,@curRow := @curRow + 1 AS RowNumber, (1894 - Limit1) AS spread1,(Limit2 - 1894) AS spread2
FROM MyTable JOIN (SELECT @curRow := 0) r WHERE name="John" AND 600>=L1 AND 600<=L2 AND 1894>=Limit1 AND 1894<=Limit2)temp WHERE RowNumber=1
UNION
SELECT number,code,(spread1)AS spread FROM(SELECT number,code,@curRow := @curRow + 1 AS RowNumber, (1894 - Limit1) AS spread1,(Limit2 - 1894) AS spread2
FROM MyTable JOIN (SELECT @curRow := 0) r WHERE name="John" AND 600>=L1 AND 600<=L2 AND 1894>=Limit1 AND 1894<=Limit2)temp WHERE RowNumber=2
ORDER BY spread DESC limit 1

当 Value1 = 950 且 Value2 = 2400 时:

SELECT number,code,(spread2)AS spread FROM(SELECT number,code,@curRow := @curRow + 1 AS RowNumber,(2400 - Limit1) AS spread1,(Limit2 - 2400) AS spread2
FROM MyTable JOIN (SELECT @curRow := 0) r WHERE name="John" AND 950>=L1 AND 950<=L2 AND 2400>=Limit1 AND 2400<=Limit2)temp WHERE RowNumber=1
UNION
SELECT number,code,(spread1)AS spread FROM(SELECT number,code,@curRow := @curRow + 1 AS RowNumber,(2400 - Limit1) AS spread1,(Limit2 - 2400) AS spread2
FROM MyTable JOIN (SELECT @curRow := 0) r WHERE name="John" AND 950>=L1 AND 950<=L2 AND 2400>=Limit1 AND 2400<=Limit2)temp WHERE RowNumber=2
ORDER BY spread DESC limit 1

当我得到一行结果时它也有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 2015-06-23
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多