Php MYSQL-选择具有最低值和其他条件的行,或具有最高值的回退
这里似乎有很多线索在问类似的问题,但我还没有找到一个可以帮助我解决问题的线索 我试图选择一个值最低的行,其中其他三个条件必须为真,或者返回到另一组条件,给定一个变量uc,然后选择最高的价格Php MYSQL-选择具有最低值和其他条件的行,或具有最高值的回退,php,mysql,join,max,Php,Mysql,Join,Max,这里似乎有很多线索在问类似的问题,但我还没有找到一个可以帮助我解决问题的线索 我试图选择一个值最低的行,其中其他三个条件必须为真,或者返回到另一组条件,给定一个变量uc,然后选择最高的价格 Table: level (sample data) id |price |copies |used |uc -------------------------------------- 1 |7 |10 |10 |charlie01 2 |17 |10
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
启动伪代码:
选择最低价格的行,其中使用的少于份数且使用的大于0且uc等于变量,或者如果没有结果,即所有使用的等于份数,则选择最高价格的行,其中使用的等于份数且uc等于变量
由于记录3,它对样本数据不起作用,即使used=copies。这是因为在记录3上使用<在记录2上使用我们想要的行,因为它的价格最低
我知道MAX是存在的,并且在最后一个小时尝试使用它,但是没有成功,我真的不认为我了解它是如何工作的,它似乎只是选择了整个列的最大值,不管发生什么
现在,我已经在循环中添加了条件之类的东西,但是我认为我需要做某种类型的连接,但是我不确定从哪里开始。你认为我应该如何回答这个问题
编辑:我真的很抱歉,我刚刚意识到我说的是最高价格,而我实际上是在尝试选择使用<副本的最低价格,但如果所有使用=副本的最高价格
干杯
Charlie如果您正在使用此工具编写生产代码,我会等待更好的答案,但有几个有趣的选项可能适合您
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远高于表中的任何预期价格
无论如何。。。相信这两个结果的输出都与您编辑的结果相匹配,但在性能方面可能非常糟糕。如果您在执行类似操作时遇到困难,您可能会将查询结果的副本存储在表中,以避免文件排序
另外,对used=0和copies>0的情况感到好奇-无法从您的描述中判断它是否应该与price asc或price desc组排序。在这些示例中,它与price desc.一起使用,但第4行是使用
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
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;
SELECT * FROM (
SELECT * FROM level
ORDER BY IF(used < copies AND used > 0, price, -price + 10000) ASC
) AS x GROUP BY uc;