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

标签 php mysql join max

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

我正在尝试选择一个具有最低值的行,其中三个其他条件必须为真或退回到另一组条件,给定一个变量(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其中 used小于 copiesused大于 0uc等于 VARIABLE或者如果没有结果(这意味着所有 used 都等于 copies )选择价格最高的行,其中 used等于 copiesuc等于 VARIABLE

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但如果所有价格最高used = copies

干杯
查理

最佳答案

如果您正在使用它编写生产代码,我会等待更好的答案,但有几个有趣的选项可能适合您...

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_avail 查询结果存储在表中以避免文件排序?

另外,对 used = 0 和 copies > 0 的情况感到好奇 - 从您的描述中无法判断它是否应该按 price asc 或 price desc 组排序。在这些示例中,它带有价格说明。

关于php - MYSQL - 选择具有最低值和其他条件的行,或具有最高值的回退,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10183516/

相关文章:

php - MySQL、PHP - 动态产品功能的搜索引擎(在另一个表中)

javascript - 在 javascript 中获取 $_REQUEST ['' ] 值

mysql - 如何从 MySQL 架构获取最新消息?

mysql计算不重叠的UNION结果

MySQL-python 1.2.3 和 OS X 10.5 : 64- or 32-bit?

mysql - MySQL中多表通过联合主键垂直合并

shell - 使用 bash 脚本从可变数量的文件中加入列的最简单方法是什么?

php - 在爆炸变量中排序

php - 更改两个域的根目录

php - mysql ADDDATE问题更新记录