查询以显示项目的顺序

时间:2012-09-11 20:37:37

标签: mysql sql

我正在尝试获取不同人吃的水果清单。

+-----------+
  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 ... ???

3 个答案:

答案 0 :(得分:0)

此查询应该加入表格:

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

答案 1 :(得分:0)

如果没有明确地对行进行排序,则不能依赖关系数据库中的行顺序,因为在表中删除并插入新记录时,返回行的顺序会有所不同。您需要有一个额外的列,比如说sequence,您将明确存储所消费水果的顺序。然后,可以直接选择sequence = 2的水果。

答案 2 :(得分: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 |
+------+--------+-------------+--------------------+------+