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