我正在尝试获取不同人吃的水果清单。
+-----------+
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 ... ???
答案 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 |
+------+--------+-------------+--------------------+------+