2

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

我正在尝试选择具有最低值的行,其中三个其他条件必须为真或回退到另一组条件,给定变量 ( 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某种类型的,但我不确定从哪里开始。你认为我应该如何处理这个查询?

编辑:我真的很抱歉,当我实际上试图选择最低价格时,我才意识到我说usedcopies是最高价格usedcopies

干杯
查理

4

1 回答 1

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;

(如果你想在 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 远高于表中的任何预期价格)

无论如何...相信这两者的输出都与您编辑的结果相匹配,但在性能方面可能很糟糕。如果您在做这样的事情时遇到困难,您可能可以将copys_avail 查询结果存储在表中以避免文件排序?

此外,对 used = 0 且副本 > 0 的情况感到好奇 - 从您的描述中无法判断它是否应该使用 price asc 或 price desc 组进行排序。在这些示例中,它是价格降序。

于 2012-04-19T05:51:37.650 回答