Php MySQL连接表并在相同值之间进行比较时从第二个表返回最新的行

Php MySQL连接表并在相同值之间进行比较时从第二个表返回最新的行,php,mysql,Php,Mysql,我有表1:用户 id | name | 1 | john | 2 | garry| 3 | sam | 表2称为员额: id | user_id | title | posted 1 | 1 | Something | 1551128761 2 | 1 | Else | 1551128761 3 | 3 | Some Title | 1551122745 4 | 2 | Demo T

我有表1:用户

id | name |

1  | john |
2  | garry|
3  | sam  |
表2称为员额:

id | user_id |     title    |   posted

1  |    1    | Something    | 1551128761
2  |    1    | Else         | 1551128761
3  |    3    | Some Title   | 1551122745
4  |    2    | Demo Title   | 1551129777
5  |    3    | Something    | 1551126793
第二个表中的user_id是第一个表中用户的id

我需要从表中获取最新的帖子,目前我正在使用以下查询:

SELECT u.id, u.name, p.title 
FROM users AS u 
LEFT JOIN posts AS p 
ON p.user_id= u.id 
WHERE p.posted = ( SELECT MAX(posted) FROM posts WHERE user_id = u.id )
ORDER BY u.id 
LIMIT 15
但此查询的问题是,如果同一用户的时间戳相同(在本例中,用户id为1的用户的时间戳相同),则我将获得这两行,而不仅仅是最新的一行(最新的一行具有最高id)

尝试此MySQL查询:

SELECT u.id, 
       u.name, 
       p.title 
FROM   users AS u 
       JOIN posts AS p 
         ON p.id = (SELECT pi.id 
                    FROM   posts AS pi 
                    WHERE  pi.user_id = u.id 
                    ORDER  BY pi.id DESC 
                    LIMIT  1); 
经过测试,效果良好。下面是一个演示:

要加快<代码>选择查询,考虑添加<代码>索引< /代码>
稍微重新构造一下查询怎么样

SELECT posts.title, users.id, users.name
FROM posts, users 
WHERE posts.user_id = users.id 
ORDER BY posts.posted DESC, posts.id DESC
LIMIT 1

基本上是从帖子中选择,按
posted
时间戳排序,其次是帖子的
id
,如果时间戳相同,则按降序排序。

一个选项使用posts表中的id列,如下所示。这是假设每个post记录的id都是不同的,即posts表


p.ticker\u id=u.id上的
不应该是p.user\u id=u.id
上的
吗?@Utkanos编辑错误,谢谢我前面有数据,我得到了这两行,但如果我在这两行中的任何一行加上一秒钟,我只得到一行(这正是我所需要的,在你的选择部分,在
u.id
8000之前,我现在需要的是
DISTINCT
,我的旧的大约需要2秒,这个大约需要25秒,但是你的确实做了我需要的。建议:有用的索引在帖子上(用户id,posted,id)…尝试索引并再次检查速度我应该怎么做?如果您使用PHPMyAdmin查看表结构,您应该能够在单击表名时看到不同的选项卡。在每行中单击
structure>Index
以添加索引,否则对所有三列运行SQL查询,如下所示:
ALTER table posts add Index(用户id);
是的,不需要在主键上添加索引-它们已经被索引:)hi@vmaroli,它可以工作,但查询时间从2秒到25秒:(id列是主键还是在posts表中具有唯一索引?如果您的posts id是唯一的,并保证按递增顺序进行筛选,则可以按id而不是按时间戳进行筛选。请参阅,这将提供更好的性能,因为它是通过唯一索引/主键
id
column对这两个表的访问都是唯一的自动增量。)s、 在post表中,我通过
user\u id
标识post/user,可以是多个(非唯一)-对于该用户发布的每个帖子,那么我之前评论中提到的SQL应该可以正常工作?因为它使用主键的访问速度也应该很快。是的,它可以,我正在使用它。我只是先使用上面的一个,直到我得到这个,所以我已经“首选”了那个。但是,我再次使用这个
SELECT posts.title, users.id, users.name
FROM posts, users 
WHERE posts.user_id = users.id 
ORDER BY posts.posted DESC, posts.id DESC
LIMIT 1
SELECT u.id, u.name, p.title,p.posted
FROM users AS u 
LEFT JOIN posts AS p 
ON p.user_id= u.id 
WHERE (p.posted,p.id) = ( SELECT MAX(posted),MAX(id) FROM posts WHERE user_id = u.id )
ORDER BY u.id