Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MYSQL-选择具有最低值和其他条件的行,或具有最高值的回退_Php_Mysql_Join_Max - Fatal编程技术网

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

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

这里似乎有很多线索在问类似的问题,但我还没有找到一个可以帮助我解决问题的线索

我试图选择一个值最低的行,其中其他三个条件必须为真,或者返回到另一组条件,给定一个变量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

启动伪代码:

选择最低价格的行,其中使用的少于份数且使用的大于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行是使用。我已撤回我的答案,因为它无法解决问题,但如果我能想出解决问题的方法,我将再次发布。谢谢,这两个查询都完全符合我的需要:您能否详细说明一下有关存储副本的部分?你的意思是存储标志1 | 0以避免对所有内容进行排序吗?实现这一点的最佳方式是什么?嘿,Charlie,他认为在db中存储used0逻辑可能会在查询中节省一些复杂性,但实际上不确定,因为我们也在order by上使用price。
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;