4

これは説明するのがちょっと難しいので、分解します...これが目的です

テーブルがあるとします

ID | Weight

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

そして、(3,4) など、関心のある ID のセットがあるとします。

私の目的は、関心のある ID と一致する行の重みが、関心のある ID の重みよりも 1 レベル低くなるように、他の 2 つの行 (2 つの関心のある ID のそれぞれに 1 行) を取得することです。

だからこの場合

ID 3 の場合、ID 2 と重み 4 の行を返す必要があります。行 ID 2 は、重み (4) が行 ID 3 (8) の重みよりも小さい最初の行だからです。

ID 4 の場合、行 ID 6 は重み (44) が行 ID 4 (66) の重みよりも小さい最初の行であるため、ID 6 と重み 44 の行を返します。

関心のある ID に IN() 表記を使用する単一のクエリで、mysql を使用してこれをどのように達成しますか.....

4

3 に答える 3

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

これを解決するには、重みが指定された重みよりも低い重み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

私は次のことを提案したいと思います(明らかにテーブル名として 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 に答える