这里似乎有很多线索提出类似的问题,但我还没找到能帮助我解决问题的那个。
我正在尝试选择一个最低值的行,其中三个其他条件必须为真或者回退到另一组条件,给定一个变量(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
小于copies
且used
大于0
且uc
等于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
干杯
查理
答案 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组进行排序。在这些例子中,它与价格描述有关。