这里似乎有很多类似的问题,但我还没有找到帮助我解决问题的线索。
我试图选择一个值最低的行,其中其他三个条件必须为真,或者返回到另一组条件,给定一个变量(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小于usedcopies大于used0等于uc的价格最低的行,或者如果没有结果(这意味着所有VARIABLE都等于used),则选择copies等于usedcopies等于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

###结束伪码###
这是我编写的查询(以VARIABLEuc为例):
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),但我不确定从哪里开始。你认为我该如何回答这个问题?
编辑:我真的很抱歉,我刚刚意识到我说的是最高价格,而实际上我正试图选择最低价格,其中JOINused但最高价格如果全部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/

10-10 23:01