2012-08-06 77 views
1

責令選擇最後一排這是我的SQL:SQL - 按日期

"SELECT users.username, users.id_user, friends.name, friends.meet_date 
FROM users INNER JOIN friends ON (users.id_user = friends.id_user) 
GROUP BY username ORDER BY username"; 

這是在我的網頁輸出:

Username Friend's Name Meeting Date 
George  Nicolas   2010 
Man   Anatol   2008 

現在,它選擇剛剛從數據庫中的第一行爲每個用戶。

每個表都有一個auto_increment,第一個表的id_user和第二個表的id_friend。

我希望它顯示每個用戶最後遇到的朋友。

我試着添加一個order by "meet_date DESC"但它不起作用。

我怎麼能實現我的願望?

+1

如果meet_date是日期/時間戳記,爲什麼不將它存儲爲真正的日期時間字段?這可以讓你按日期排序,而不是日期的字符串值。 – 2012-08-06 18:41:04

+0

我已將它更改爲日期時間,並且我的「meet_date DESC」順序仍然不起作用:/ – Hypn0tizeR 2012-08-06 18:44:09

回答

3

簡單的方法是一個子查詢:

SELECT 
    users.username, 
    users.id_user, 
    (select friends.name 
    from friends 
    where (users.id_user = friends.id_user) 
    ORDER BY friends.meet_date desc 
    LIMIT 1) as friend_name,  
    (select friends.meet_date 
    from friends 
    where (users.id_user = friends.id_user) 
    ORDER BY friends.meet_date desc 
    LIMIT 1) as friend_meet_date 
FROM users 
; 

*測試*

create table users (username varchar(50), id_user int); 
create table friends (name varchar(50), id_user int, meet_date int); 

insert into users values ('a', 1),('b',2); 
insert into friends values ('c', 1, 0), ('d',1,1); 

結果:

| USERNAME | ID_USER | FRIEND_NAME | FRIEND_MEET_DATE | 
------------------------------------------------------- 
|  a |  1 |   d |    1 | 
|  b |  2 |  (null) |   (null) | 

Try it at sql fiddle

請注意,相關的子查詢不是一種優雅的方法,是簡單的方法。

+0

謝謝,我正在重寫我的代碼。 – Hypn0tizeR 2012-08-06 18:51:10

+0

爲什麼我得到「mysqli_num_rows()期望參數1爲mysqli_result,布爾給定」?現在在我的網頁上的輸出是空的......沒有選中? – Hypn0tizeR 2012-08-06 19:35:43

+0

在phpmyadmin或mysql控制檯中複製此查詢並進行測試。如果查詢自行工作,請在新問題上發佈另一個問題。如果查詢在phpmyadmin或mysql控制檯中不起作用,請編輯答案併發布新數據以隔離標記。 – danihp 2012-08-06 19:53:15

1

您沒有auto_increment字段嗎?這將允許您按此排序。另一種選擇是將meet_date更改爲日期字段,以便您可以通過它進行正確排序。沒有理由存儲DateTime作爲varchar

+0

我已將其更改爲日期時間,但Sorting By的第二部分如何? – Hypn0tizeR 2012-08-06 18:47:34

+0

是的,我有一個auto_increment字段! – Hypn0tizeR 2012-08-06 18:50:33

1

假設你已經在users表得到id作爲primary keyauto_increment,這應該做的伎倆:

SELECT MAX(users.id), users.username, users.id_user, friends.name, friends.meet_date 
FROM users INNER JOIN friends ON (users.id_user = friends.id_user) 
GROUP BY username ORDER BY username 
0
SELECT users.username, users.id_user, friends.name, friends.meet_date 
FROM users INNER JOIN friends ON (users.id_user = friends.id_user) 
GROUP BY username ORDER BY username 
having max(friends.meet_date)=friends.meet_date 
+0

不起作用:/ – Hypn0tizeR 2012-08-06 19:08:06

4

一個標準技巧是使用一個外自聯接:

SELECT users.username, users.id_user, friends.name, friends.meet_date 
FROM users 
INNER JOIN friends ON (users.id_user = friends.id_user) 
LEFT JOIN friends f2 ON friends.meet_date > f2.meet_date 
WHERE f2.(primary key) IS NULL 
GROUP BY username 
ORDER BY username 

其中發現日期爲其中不存在其他記錄具有更大的日期值。這避免了相關子查詢和額外聚集的低效率;或者可疑的假設,即記錄總是以滿足日期順序添加,如果您想使用主鍵,則順序是必需的。

*由其他用戶編輯*

,就應該替換(主鍵)按主鍵列的表格,或只是由F2柱:

SELECT users.username, users.id_user, friends.name, friends.meet_date 
FROM users 
left JOIN friends ON (users.id_user = friends.id_user) 
LEFT JOIN friends f2 ON friends.meet_date > f2.meet_date 
WHERE f2.id_user IS NULL 
GROUP BY username 
ORDER BY username 

查詢運行作爲spected:

| USERNAME | ID_USER | NAME | MEET_DATE | 
------------------------------------------- 
|  a |  1 |  c |   0 | 
|  b |  2 | (null) | (null) | 
+0

我喜歡這個把戲。你確定這個非等價的查詢比關聯的子查詢有更多的性能嗎? – danihp 2012-08-06 19:58:25

+0

#1064 - 您的SQL語法錯誤;檢查與你的MySQL服務器版本相對應的手冊,在'(主鍵)'附近使用正確的語法...這是我得到 – Hypn0tizeR 2012-08-06 20:14:36

+0

對編輯你的答案感到抱歉。你的技巧似乎是一個非常好的方法+1。 – danihp 2012-08-06 20:17:18