Php MySQL连接表并在相同值之间进行比较时从第二个表返回最新的行
我有表1:用户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
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