MYSQL - 具有最低值和其他条件的SELECT行,或具有最高值的回退

时间:2012-04-17 00:29:47

标签: php mysql join max

这里似乎有很多线索提出类似的问题,但我还没找到能帮助我解决问题的那个。

我正在尝试选择一个最低值的行,其中三个其他条件必须为真或者回退到另一组条件,给定一个变量(uc)并选择最高的价格。

Table: level (sample data)
id  |price  |copies |used   |uc
--------------------------------------
1   |7      |10     |10     |charlie01
2   |17     |10     |8      |charlie01
3   |37     |5      |5      |charlie01
4   |47     |10     |9      |charlie01
7   |5      |15     |9      |charlie02
8   |15     |15     |0      |charlie02
9   |35     |15     |0      |charlie02
10  |45     |15     |0      |charlie02
11  |3      |5      |5      |charlie03
12  |13     |5      |5      |charlie03

结果: 编辑结果 - charlie01应为2

VARIABLE    |RESULTING ROW
--------------------------
charlie01   |2
charlie02   |7
charlie03   |12

### START Pseudocode:###

选择最低 price的行,其中used小于copiesused大于0uc等于VARIABLE或者如果没有结果(这意味着所有used都等于copies)选择价格最高的行used等于{{} 1}}和copies等于uc

VARIABLE

### END Pseudocode ###

这是我写的查询(以SELECT * FROM level WHERE ( used < copies AND used > 0 AND uc = *VARIABLE* ) ### OR IF NO RESULTS ### ( used = copies AND uc = *VARIABLE* ) ORDER BY price ASC LIMIT 1 uc为例):

charlie01

由于记录SELECT * FROM ( SELECT * FROM `level` WHERE (( `used` < `copies` AND `used` > '0' ) OR ( `used` = `copies` )) AND `uc` = 'charlie01' ORDER BY `price` ASC ) AS T ORDER BY `used` ASC LIMIT 1 ,它对样本数据无效,即使3也是如此。这是因为used = copies

我知道 MAX()存在并且已经尝试了最后一小时使用它,但没有成功,我真的不认为我理解它是如何工作的,它似乎只是选择无论什么......整个列的最大值?

现在,我已经绕圈添加了条件等等,但我想我需要做某种类型的used on record 3 < used on record 2 (the row we want, because it has the lowest price),但我不确定从哪里开始。您认为我应该如何处理此查询?

编辑:我很抱歉,当我真正尝试选择JOIN&lt; used时的最低价格时,我才意识到我说价格最高copies如果所有used = copies

,则价格最高

干杯
查理

1 个答案:

答案 0 :(得分:1)

如果您正在处理生产代码,我会等待更好的答案,但有几个有趣的选项可能对您有用......

SELECT * FROM (
  SELECT *, (used < copies and used > 0) AS copies_avail FROM level
  ORDER BY copies_avail desc, IF(copies_avail, price, -price) ASC
) AS x GROUP BY uc;

(如果要在where子句中指定uc,可以使用内部部分)

类似的选项,更有趣(试图不说hackish = p)将是

SELECT * FROM (
  SELECT * FROM level 
  ORDER BY IF(used < copies AND used > 0, price, -price + 10000) ASC
) AS x GROUP BY uc;

(其中10000远高于表中的任何预期价格)

无论如何......相信这两者的输出都符合您编辑的结果,但可能性能非常糟糕。如果您确实遇到了类似这样的问题,您可以将copies_avail查询结果存储在表中以避免文件输出?

同样,对使用= 0和副本&gt;的情况感到好奇0 - 无法从您的描述中判断是否应使用价格asc或价格desc组进行排序。在这些例子中,它与价格描述有关。