0

さまざまな人が食べた果物のリストを取得しようとしています。

+-----------+
  ID   Name 
+----+------+
   1   Paul 
   2   John 
   3   Nick 
+----+------+
Table: users

+--------+--------+
  userID   Fruit
+--------+--------+
   1       Apple   
   2       Peach   
   2       Orange  
   2       Apple   
   3       Apple   
   3       Peach  
+--------+--------+
Table: eats

これで、誰が何を食べたかのリストを簡単に取得できます。しかし、2番目に誰がどの果物を食べたか知りたい場合は? 結果は次のようになります。

+--------+----------+
  Name     Fruit
+--------+----------+
  John     Orange
  Nick     Peach
+--------+----------+
 Result

SELECT Name, Fruit FROM users, eats WHERE ID = userID ... ???
4

3 に答える 3

0

テーブルで新しいレコードを削除および挿入すると、返される行の順序が変化するため、行を明示的に順序付けせずにリレーショナル データベースの行順序に依存することはできません。sequenceたとえば、消費された果物の順序を明示的に保存する追加の列が必要になります。次に、 で果物を選択するのは簡単sequence = 2です。

于 2012-09-11T20:47:37.363 に答える
0

@lanzzが指摘しているように、注文を当てにすることはできません。シーケンスを維持するにはコストがかかりますが、タイムスタンプを保存していて、行が順番に返されるとしましょう...

変数を使用して、名前ごとに表示された行数を覚えておいてください。同じ人を見ながら変数を反復し、新しい人にぶつかったらリセットします。次に、目的のシーケンスを持つレコードのみを吐き出します。(これには、n の任意の値に対してユーザーの n 番目の行を選択できるという追加の利点があります)。

set @seen_name = null;
set @seq = 1;
select * from (
  SELECT Name, Fruit,
    case when @seen_name is null OR @seen_name != name then @seq := 1 else @seq := @seq + 1 end as seq_formula,
    @seen_name := name,
    @seq as seq
  FROM users, eats
  WHERE ID = userID
) foo
where seq = 2;

そして出来上がり:

+------+--------+-------------+--------------------+------+
| Name | Fruit  | seq_formula | @seen_name := name | seq  |
+------+--------+-------------+--------------------+------+
| John | Orange |           2 | John               |    2 |
| Nick | Peach  |           2 | Nick               |    2 |
+------+--------+-------------+--------------------+------+
于 2012-09-11T21:21:27.473 に答える
0

このクエリは、テーブルを結合する必要があります。

SELECT eats.Fruit, users.Name FROM eats, users WHERE users.ID = eats.userID

于 2012-09-11T20:44:53.043 に答える