这里似乎有很多类似的问题,但我还没有找到帮助我解决问题的线索。
我试图选择一个值最低的行,其中其他三个条件必须为真,或者返回到另一组条件,给定一个变量(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
###启动伪代码:###
选择
price
小于used
且copies
大于used
且0
等于uc
的价格最低的行,或者如果没有结果(这意味着所有VARIABLE
都等于used
),则选择copies
等于used
且copies
等于uc
的价格最高的行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
###结束伪码###
这是我编写的查询(以
VARIABLE
uc
为例):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
由于记录
charlie01
,它对样本数据不起作用,即使3
。这是因为used = copies
我知道Max()存在并试图在最后一个小时使用它,但是没有成功,我真的不认为我理解它是如何工作的,它似乎只是选择了整个列的最大值,不管……
现在,我绕了一圈添加条件之类的,但我想我需要做某种类型的
used on record 3 < used on record 2 (the row we want, because it has the lowest price)
,但我不确定从哪里开始。你认为我该如何回答这个问题?编辑:我真的很抱歉,我刚刚意识到我说的是最高价格,而实际上我正试图选择最低价格,其中
JOIN
used
但最高价格如果全部copies
=used
干杯
查理
最佳答案
如果你用这个来开发产品代码,我会等待一个更好的答案,但是有几个有趣的选项可能对你有用。。。
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\u avail查询结果存储在表中以避免文件排序?
另外,对used=0和copies>0的情况感到好奇-无法从您的描述中判断它是否应该与price asc或price desc组排序。在这些例子中,它与price desc。
关于php - MYSQL-具有最低值和其他条件的SELECT行,或具有最高值的后备状态,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10183516/