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

现在我可以很容易地得到谁吃了什么的清单。但是如果我想知道谁吃了第二个水果?结果将是:

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

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

3 回答 3

0

这个查询应该加入表:

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

于 2012-09-11T20:44:53.043 回答
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 回答