2017-10-17 83 views
0

我有一个预约表,我需要选择为所有用户的最新记录,目前我的查询返回的最古老的每个用户ID,而不是最新的一个每个如何选择所有的最新记录所有用户的

委任表格

+-------+--------------+--------------+--------------+ 
| ID | time   | userid  | description | 
+-------+--------------+--------------+--------------+ 
| 1  | 2017-10-20 | 4   | etc   | 
+-------+--------------+--------------+--------------+ 
| 2  | 2017-10-21 | 6   | etc   | 
+-------+--------------+--------------+--------------+ 
| 3  | 2017-10-22 | 7   | etc   | 
+-------+--------------+--------------+--------------+ 
| 4  | 2017-10-23 | 8   | etc   | 
+-------+--------------+--------------+--------------+ 
| 5  | 2017-10-24 | 6   | etc   | 
+-------+--------------+--------------+--------------+ 
| 6  | 2017-10-25 | 7   | etc   | 
+-------+--------------+--------------+--------------+ 

用户表

+-------+--------------+--------------+--------------+ 
| ID | first  | last   | status  | 
+-------+--------------+--------------+--------------+ 
| 4  | jo   | do   | 1   | 
+-------+--------------+--------------+--------------+ 
| 6  | jid   | did   | 1   | 
+-------+--------------+--------------+--------------+ 
| 7  | jone   | done   | 1   | 
+-------+--------------+--------------+--------------+ 
| 8  | ja   | da   | 1   | 
+-------+--------------+--------------+--------------+ 

当前查询

$sql = "SELECT * 
     FROM appointment 
     LEFT JOIN users AS user 
     ON user.id = appointment.userid 
     WHERE user.status = 1 
     GROUP BY appointment.userid 
     "; 

当前结果

+-------+--------------+--------------+--------------+ 
| ID | time   | userid  | description | 
+-------+--------------+--------------+--------------+ 
| 1  | 2017-10-20 | 4   | etc   | 
+-------+--------------+--------------+--------------+ 
| 2  | 2017-10-21 | 6   | etc   | 
+-------+--------------+--------------+--------------+ 
| 3  | 2017-10-22 | 7   | etc   | 
+-------+--------------+--------------+--------------+ 
| 4  | 2017-10-23 | 8   | etc   | 
+-------+--------------+--------------+--------------+ 

预期输出

+-------+--------------+--------------+--------------+ 
| ID | time   | userid  | description | 
+-------+--------------+--------------+--------------+ 
| 1  | 2017-10-20 | 4   | etc   | 
+-------+--------------+--------------+--------------+ 
| 4  | 2017-10-23 | 8   | etc   | 
+-------+--------------+--------------+--------------+ 
| 5  | 2017-10-24 | 6   | etc   | 
+-------+--------------+--------------+--------------+ 
| 6  | 2017-10-25 | 7   | etc   | 
+-------+--------------+--------------+--------------+ 
+0

你有一组通过,但没有聚集函数.. – Randy

回答

1

试试这个

SELECT a.ID, a.time, a.userid, a.description 
FROM users u 
INNER JOIN appointment a ON u.id = a.userid 
WHERE u.status = 1 
AND time in(SELECT MAX(time) from appointment t WHERE t.userid = a.userid) 
+0

作品完美,但我有,如果我一个问题想要添加一个条件为另一列'季节'在预约会见我应该在哪里添加'AND'? – mirvatJ

+0

@mirvatJ你应该可以在where子句中的任何地方添加它。你尝试添加它吗? – isaace

+0

肯定的,我得到这个错误无论我加吧'语法错误或访问冲突:1064您的SQL语法错误;检查对应于你的MySQL服务器版本使用附近的“正确的语法手册:季节和时间is' – mirvatJ

-1
SELECT max(appointment.id), max(time), user.id, description 
FROM appointment 
LEFT JOIN users AS user 
ON user.id = appointment.userid 
WHERE user.status = 1 
GROUP BY appointment.userid 
+0

这个答案是错的,而左连接将改造成一个内部联接,因为你'WHERE'条款。 – sagi

0

您可以自连接至IDENT IFY的最新任命:

SELECT s.* FROM (
    SELECT * 
    FROM appointment 
    LEFT JOIN users AS user 
    ON user.id = appointment.userid and user.status = 1) s 
LEFT JOIN appointment p 
ON(p.userid = s.userid and p.time < s.time) 
WHERE p.time IS NULL 

虽然我不明白为什么要LEFT JOINusers

+0

所以它不返回的情况下,出现了在一个数据库中的用户删除的记录错误,还有什么做u建议?也sagi为什么你用时间为空? – mirvatJ

+0

什么?请尝试解释你自己。 – sagi

+0

通常当我使用内部连接和我删除记录让来自用户的说,它在所有的查询将返回一个错误,但是当我使用左侧加入它不会(可能是我可能不是正确的),但它只是我的遭遇来我在此之前,我试图避免 – mirvatJ

0
SELECT MAX(a.ID) ID, MAX(a.time) time, a.userid, MAX(a.description) description 
FROM appointment a 
INNER JOIN users u ON u.id = a.userid 
WHERE u.status = 1 
GROUP BY a.userid 
ORDER BY a.ID 

输出

ID time     userid description 
1 2017-10-20T00:00:00Z 4  etc 
5 2017-10-24T00:00:00Z 6  etc 
6 2017-10-25T00:00:00Z 7  etc 
4 2017-10-23T00:00:00Z 8  etc 

SQL小提琴:http://sqlfiddle.com/#!9/6b0c1c/7/0

+0

你所依赖的事实'MAX(时间)'将'MAX(ID)来对应' ,尽管在数据样本中看起来是这样,但并不一定是这样。 – sagi

+0

@sagi我同意,我需要更多的样本数据来确认。 – Matt

+0

但我会给予好评用于察觉它可能:) – sagi

0

我觉得left join与用户表是不必要的。 下面的查询将产生预期的结果

select a1.* from appointment a1 
inner join (select max(id) as id ,userid from appointment group by userid) a2 
on a1.id=a2.id 

SQL Fiddle