4

这有点难以解释,所以我会分解它......这是目标

假设你有一张桌子

ID | Weight

1     2
2     4
3     8
4     66
5     11 
6     44
7     33

假设我有一组感兴趣的 ID,比如 (3,4)

我的目标是获取另外两行(两个感兴趣的 ID 各一个),以便与感兴趣的 ID 匹配的行的权重比感兴趣的 ID 的权重低一级

所以在这种情况下

对于 id 3,我们希望返回 ID 2 和权重 4 的行,因为行 id 2 是第一行,其权重 (4) 小于行 id 3 (8) 的权重

对于 id 4,我们希望返回 id 6 和权重 44 的行,因为行 id 6 是第一行,其权重 (44) 小于行 id 4 (66) 的权重

您将如何在一个查询中使用 mysql 完成此操作,我们使用 IN() 表示法表示感兴趣的 ID .....

4

3 回答 3

0

您可以解决这个问题,选择按权重 desc 排序的行中的第一行,其中权重低于给定的权重,在这种情况下,对于 mysql 类似:

select * from t where weight < (select weight from t where id = :id) order by weight desc limit 1

在遵循上述想法的 in 语句中,您可能会有类似的内容:

select * from (select id, (select weight from t where weight < (select weight from t where id = tp.id) order by weight desc limit 1) from t tp) a where id in (3,4)
于 2012-05-15T17:39:50.943 回答
0

另一个没有子查询的解决方案:

select w1.id,w1.weight,
left(group_concat(w2.id order by w2.id desc ),LOCATE(',', group_concat(w2.id order by w2.id desc ))-1) as w2_id,
left(group_concat(w2.weight order by w2.weight desc ),LOCATE(',', group_concat(w2.weight order by w2.weight desc ))-1) as w2_weight

from weight as w1, weight as w2 
where w2.weight < w1.weight
and w1.id in (3,4)
group by w1.id
于 2012-05-15T20:09:25.793 回答
0

我想提出以下建议(显然使用 ourtable 作为表名)

SELECT id,weight FROM ourtable WHERE weight IN (SELECT MAX(t.weight) FROM ourtable t,ourtable t2 WHERE t.weight < t2.weight && t2.id IN (3,4) GROUP BY t2.id);

它给出了以下结果

+----+--------+
| id | weight |
+----+--------+
|  2 |      4 |
|  6 |     44 |
+----+--------+

按照要求。

于 2012-05-27T00:16:35.390 回答