【问题标题】:MySQL min/max with joined table带有连接表的 MySQL 最小值/最大值
【发布时间】:2013-07-25 20:40:18
【问题描述】:

基本上,我有一个搜索查询可以成功获取我需要的所有结果。我还在检查所有行的计数(超出最后一个查询限制),对不同类别 ID 的计数,现在我只需要一个最小值/最大值,希望在同一个查询中。

我看到的问题是它来自一个连接查询,所以我需要加入,匹配每个连接的 id,然后检查我想要最小/最大的数字。

假设我有 20 个结果,所有结果都有不同的“价格”,但价格在另一个表中,我想从另一个表中找到最低和最高价格。我只需要一个最小值和最大值的结果,所以我不妨将它与我的计数查询一起添加(因为它还必须绕过主查询的限制部分)。

对此有什么想法吗?

这里有一些额外的细节(主要的查询加入)

$query->join('LEFT','#__mrsp AS m
   ON (t.name = m.name AND m.mrsp = 
     (SELECT min(mrsp) FROM #__mrsp WHERE name = t.name))');

name 在这种情况下是一个唯一的数值,所以它像 id 一样工作。这也是joomla 数据库语法。

我在此连接中选择最小值,因为一个 mrsp(多个供应商)可以有多个结果,所以我只需要最低的一个来进行主查询。为了稍微扩展我的问题,“max”需要是返回的最高“min”值,但这并不重要。

编辑:

这里有更多细节。

基本上每个产品都有 50 个供应商,我希望它们的最低价格都降到 1。

现在,如果在最小加入后有 1300 种产品,也应该附加 1300 个价格,所以我想要 1 列用于最小找到的价格和 1 列用于最高找到的价格。

这将导致结果显示任何结果将具有的最低价格,并且在您的搜索期间将具有最高价格和结果。

也就是说,如果每种产品有 50 个供应商,那么价格表将有 50*1300 行。我需要 1300 - 1300 行,因此初始最小值非常适合。

这是当前查询的构建:

SELECT 
  MAX(m.mrsp) max_price,
  MIN(m.mrsp) min_price 
FROM #__products t 
LEFT JOIN #__mrsp m ON t.name = m.name 
WHERE IF(t.width IS NOT NULL, IF(t.w_override, t.j_width, t.width), t.j_width) = 17 
  AND (t.publish_up = '0000-00-00 00:00:00' OR t.publish_up <= '2013-07-25 20:14:22') 
  AND (t.publish_down = '0000-00-00 00:00:00' OR t.publish_down >= '2013-07-25 20:14:22')       
  AND t.state = 1 
ORDER BY t.id

【问题讨论】:

  • 现在有什么问题??
  • 它返回最小值作为最大值,最大值作为最小值,或者只是返回错误的值。目前正在尝试调查它。
  • 你的查询有很多ifs。首先尝试仅使用连接和排序方式进行查询。看看它是否给你正确的结果。然后你继续一一添加条件,每次测试它给你带来什么结果。
  • 我想我发现了,查询没有问题,但数据中没有问题。我没想过要验证它是在寻找号码。

标签: mysql sql


【解决方案1】:

您应该按产品 ID 订购并选择 MAX(价格)、MIN(价格)。如果不允许您在同一 SQL 语句中选择最小值和最大值,则可能需要执行两个单独的查询。

例如

Select name, Max(price, Min(price) from products join 
customer on customer_fk = customer_id
order by product_id(or in your case product_name)

【讨论】:

  • 最小值/最大值将基于所有产品,而不仅仅是 mrsp 上的匹配项。因此,如果有 1300 个结果,我需要根据所有 1300 个结果找到最高价格和最低价格。
  • 你想找到每个产品与它自己比较的最高价格还是你想找到所有产品的最高价格?
  • 我更新了问题以更详细地说明问题,在您看到人们对什么感到困惑之前,总是很难解释这个问题。很抱歉有任何混淆。
  • 检查我新编辑的答案。我希望它对你有帮助。如果它对你有帮助,请给我一个;)
  • 让我感到困惑的结果,但一个开始,我会投票。现在它把最低的当成最高的,把最高的当成最低的。
猜你喜欢
  • 2014-11-05
  • 2011-11-27
  • 2013-11-03
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
  • 2018-12-01
相关资源
最近更新 更多