这里似乎有很多线程在问类似的问题,但我还没有找到可以帮助我解决问题的线程。
我正在尝试选择具有最低值的行,其中三个其他条件必须为真或回退到另一组条件,给定变量 ( 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行(这意味着所有都等于) 选择等于和等于的价格最高的行usedcopiesused0ucVARIABLEusedcopiesusedcopiesucVARIABLE
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. 这是因为used on record 3 < used on record 2 (the row we want, because it has the lowest price)
我知道MAX()存在并在最后一个小时尝试使用它,但没有成功,我真的不认为我理解它是如何工作的,无论如何似乎只是选择了整个列的最大值...?
现在,我绕着圈子添加条件等,但我认为我需要做JOIN某种类型的,但我不确定从哪里开始。你认为我应该如何处理这个查询?
编辑:我真的很抱歉,当我实际上试图选择最低价格时,我才意识到我说used的copies是最高价格usedcopies
干杯
查理