1

このSQLを使用すると、次のIDを使用してアルファベット順に次の名前を取得できます。

SELECT id 
FROM `names` 
WHERE `name` > (SELECT `name` FROM `names` WHERE `id` = X) 
ORDER BY `name` ASC, `id` ASC

しかし、私がこれらを持っていると仮定しましょう私はこれらの記録を持っています

id | name
---------
12 | Alex
8  | Bert
13 | Bert
17 | Bert
4  | Chris

参照としてID12があるとすると、結果が得られます

id | name
---------
8  | Bert
13 | Bert
17 | Bert
4  | Chris

しかし、参照として8を使用すると、次のようになります。

id | name
---------
4  | Chris

バート13と17はスキップされます。

4

3 に答える 3

2

これは当たり前のように思えるかもしれませんが、名前と名前などの2つのフィールドで並べ替える場合は、前または次の結果を見つけるために、名前と名前のフィールドを連結( CONCAT/ )する必要があります。CONCAT_WS同じ名前がある場合は、ある名前から別の名前にループしたり、また戻ったりすることがあります。これを防ぐには、行のIDを連結された姓名の末尾に連結します。これは、名前がアルファベット順に挿入されていないかのようにIDが現在のIDより大きいかどうかをテストするよりもうまく機能し(OR n.names = q.name AND n.id > q.id)、結果のセクションを見逃します(次/前の結果を参照するときに必要なものではありません)。これが誰かを助けることを願っています。

于 2011-06-09T13:33:54.403 に答える
1

これは、大なり記号を使用して名前を比較しているためです。これにより、に等しい名前はすべて除外されます。IDを尊重し続けたい場合:

SELECT n.id 
FROM names n
JOIN (SELECT name, id FROM names WHERE id = X) q
  ON n.id = q.id
WHERE n.name > q.name
   (OR n.names = q.name AND n.id > q.id)
ORDER BY n.name ASC, n.id ASC

ここでは、内部クエリを使用して、名前だけでなく、対応するIDも返します。名前が等しい場合は、IDをタイブレーカーとして使用できます。

于 2011-03-10T03:37:14.380 に答える
1

次のような条件を試してください。

WHERE `name` > (SELECT `name` FROM `names` WHERE `id` = X)
      OR `name` = (SELECT `name` FROM `names` WHERE `id` = X) AND `id` > X
于 2011-03-10T03:38:05.413 に答える