2012-09-11 17 views
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 ... ??? 
+0

您releationship是錯的.. –

回答

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 | 
+------+--------+-------------+--------------------+------+ 
+0

美麗,這正是我正在尋找。事實上,我的實際項目確實有一個時間戳來按照正確的順序排列我的行。感謝Alain和其他所有加入討論的人。 –

0

這個查詢應該聯接表:

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

+0

你實際上只是在重複已經包含在查詢有問題。 – lanzz

+0

@lanzz,問題中沒有包含任何正在運行的查詢......只是一個斷開的部分查詢。你在說什麼?? ] –

+0

第二個代碼塊具有在其最後一行相同的查詢和你,雖然沒有完全合格的列名(這是不實際需要,因爲不存在不明確的列名稱)。你的回答不添加任何東西給它,你只要去掉省略號和問號(這顯然並非是查詢的一部分,因爲它會被執行,但一個跡象表明,提問者想知道還有什麼要補充查詢) – lanzz

0

在關係數據庫中沒有明確排序的行你不能依靠排順序,返回的順序行將隨您在表格中刪除並插入新記錄而變化。您需要額外添加一列,例如sequence,您將明確存儲所消耗水果的順序。然後,用sequence = 2選擇水果很簡單。

相關問題