5

私はテーブルを持っていますpeople

id    name
----+-----
54    Tango
76    Alpha
95    Radio

ウェブ上でレコードを表示するとき、それらの名前はアルファベット順に並べられます

Alpha, Radio, Tango

詳細を表示していて、いくつかのリンクを使用しRadioて次(Tango)または前のレコードに移動したいとしましょう。(Alpha)

id's必要なリンクを作成するためにそれらを見つけるにはどうすればよいですか?

次の上位または下位idを見つけることは機能しません。

これは可能ですか?

ありがとう。

4

5 に答える 5

5

まだ完了していません。

前へ

SELECT Id FROM people WHERE name < 'Radio' ORDER BY name DESC LIMIT 1

SELECT Id FROM people WHERE name > 'Radio' ORDER BY name ASC LIMIT 1
于 2012-11-30T18:25:18.347 に答える
4

あなたはこれを行うことができます:

SELECT name
FROM
(
   SELECT name, (@rownum := @rownum + 1) rank
   FROM people, (SELECT @rownum := 0) t
   ORDER BY name
) t WHERE rank = @n

rankこれらのリンクを作成するには、新しいランキング番号列を使用する必要があります。次に、パラメーターの値を制御して@n、前または次を取得する必要があります。

SQL フィドルのデモ

于 2012-11-30T18:25:03.090 に答える
0

最もクリーンで効率的な方法は次のとおりです。

 select min(name) people where name > 'RADIO';

前に取得するには:

 select max(name) people where name < 'RADIO';
于 2015-06-11T08:25:37.740 に答える
0

名前が繰り返される場合、前の行と次の行を検索するときに「現在」の行をどのように識別しますか? IDで識別していると思います。いずれにせよ、行を一意にアドレス指定する何らかの方法が必要です。

私はこれをテストしました:

USE test;
DROP TABLE IF EXISTS t;
CREATE TABLE t (id INT PRIMARY KEY, name VARCHAR(10));

INSERT INTO t (id, name) VALUES
(54, 'Tango'),
(76, 'Alpha'),
(78, 'Alpha'),
(95, 'Radio');

(SELECT * FROM t WHERE id >= 76 ORDER BY id ASC LIMIT 2)
UNION
(SELECT * FROM t WHERE id <= 76 ORDER BY id DESC LIMIT 2)
ORDER BY id ASC;

UNION は、id=76 の重複行を排除します。

結果は次のとおりです。

+----+-------+
| id | name  |
+----+-------+
| 54 | Tango |
| 76 | Alpha |
| 78 | Alpha |
+----+-------+
于 2012-11-30T19:07:57.037 に答える
0

max() で以前の名前を選択できます。

select max(name) as name
from people
where name < 'Radio';

その後、そのクエリを JOIN の派生テーブルとして使用できます。

select id
from people
inner join 
  (select max(name) as name
   from people
   where name < 'Radio') as t2 on t2.name = people.name

次の名前も同様で、min() と>演算子を使用しています。

設計で名前の重複が許可されている場合、派生テーブルは複数の行を返します。これは一般的に人工鍵の問題です。

{100, 'Obama'} で始まる場合、次の意味は何ですか。データには以下が含まれます

{ 50, 'Romney'}
{150, 'Romney'}
{843, 'Romney'}
于 2012-11-30T18:47:15.973 に答える