要从多个表中选择的查询MySQL
我有两张桌子。我的任务是选择最后一个人的评论 数据库用户(数据库用户id、名称、余额) db\u comment(db\u comment\u id,db\u user\u id,文本) 我的问题是:要从多个表中选择的查询MySQL,mysql,sql,greatest-n-per-group,Mysql,Sql,Greatest N Per Group,我有两张桌子。我的任务是选择最后一个人的评论 数据库用户(数据库用户id、名称、余额) db\u comment(db\u comment\u id,db\u user\u id,文本) 我的问题是: SELECT db_user.name,db_comment.text FROM db_user INNER JOIN db_comment ON db_user.db_user_id = db_comment.db_user_id ORDER BY db_comment.db_user_id D
SELECT db_user.name,db_comment.text
FROM db_user INNER JOIN db_comment ON db_user.db_user_id = db_comment.db_user_id
ORDER BY db_comment.db_user_id DESC
尝试使用限制
,但失败
有值的表已在此处创建:
我的数据采样应该收到每个人(db\u user.name
)的最后一条评论(db comment.text
)
С条件下,您不能添加新字段。您可以使用以下解决方案,使用附加的
连接:
SELECT dbu.name, dbc.text
FROM db_user dbu INNER JOIN (
SELECT MAX(db_comment_id) AS db_comment_id, db_user_id
FROM db_comment
GROUP BY db_user_id
) dbc_max ON dbu.db_user_id = dbc_max.db_user_id
INNER JOIN db_comment dbc ON dbu.db_user_id = dbc_max.db_user_id
AND dbc.db_comment_id = dbc_max.db_comment_id
ORDER BY dbu.db_user_id DESC
。。。或者直接在选择上使用子选择:
SELECT dbu.name, (
SELECT `text`
FROM db_comment dbc
WHERE dbu.db_user_id = dbc.db_user_id
ORDER BY dbc.db_comment_id DESC
LIMIT 1
) AS `text`
FROM db_user dbu
ORDER BY dbu.db_user_id DESC
最后一条注释是ID最高的注释。因此,请确保用户没有更高的注释:
SELECT
u.name,
c.text
FROM db_user u
JOIN db_comment c ON c.db_user_id = u.db_user_id
AND NOT EXISTS
(
SELECT *
FROM db_comment c2
WHERE c2.db_user_id = c.db_user_id
AND c2.db_comment_id > c.db_comment_id
);
或者使用每个用户的最高评论ID列表:
SELECT
u.name,
c.text
FROM db_user u
JOIN db_comment c ON c.db_user_id = u.db_user_id
AND (c.db_user_id, c.db_comment_id) IN
(
SELECT db_user_id, MAX(db_comment_id)
FROM db_comment
GROUP BY db_user_id
);
从MySQL 8开始,您还可以使用窗口功能。例如:
SELECT
u.name,
c.text
FROM db_user u
JOIN
(
SELECT
db_user_id,
text,
ROW_NUMBER() OVER (PARTITION BY db_user_id ORDER BY db_comment_id DESC) AS rn
FROM db_comment
) c ON c.db_user_id = u.db_user_id AND c.rn = 1;
演示:我将使用相关子查询进行筛选。在许多情况下,这是一种性能最好的方法,尤其是在db\u comment(db\u user\u id,db\u comment\u id)
上有索引时:
这假设最后一条注释是具有最高db\u comment\u id
的注释
name text
Ivan Message3 ivan
Petr Message3 Petr
Artur Message2 Artur
John Message2 John
试试看-
SELECT db_user.name,db_comment.text
FROM db_user
INNER JOIN db_comment
ON db_user.db_user_id = db_comment.db_user_id
ORDER BY db_user.db_user_id DESC, db_comment.db_comment_id desc
limit 1
或
如果限制不起作用,那么您可以使用MAX函数并使用join self table其他方法,而无需使用MAX(db\u comment\u id)
或按db\u user\u id分组
,complety通过过滤工作
查询
SELECT
db_user.name
, db_comment1.text
FROM
db_comment db_comment1
LEFT JOIN
db_comment db_comment2
ON
db_comment1.db_user_id = db_comment2.db_user_id
AND
db_comment1.db_comment_id < db_comment2.db_comment_id
INNER JOIN
db_user
ON
db_comment1.db_user_id = db_user.db_user_id
WHERE
db_comment2.db_user_id IS NULL
性能说明:它需要在db\u comment
表上有索引(db\u user\u id,db\u comment\u id)
,否则它不会很快。如果您有那个索引,MySQL应该能够在运行这个查询时处理(非常)大的表
请参阅“Сcondition,您不能添加新字段”作业?您的mysql版本是什么?它是否支持分析功能,例如,行号
如何确定最后一个人的评论?选择db_user.name,db_comment.text FROM db_user internal JOIN db_comment ON db_user.db_user id=db_comment.db_user_id ORDER BY db_comment.db_user_id DESC LIMIT 1;这对我有效。该查询有效@umairqayyum是的,它不会选择正确的数据。。两个查询都不会给出正确的结果,因为两个查询都将返回1条记录。@RaymondNijland Acceptation只是查询的一个结果?接受的是什么,这将不会给出topicstarter所追求的正确结果。。
SELECT db_user.name,db_comment.text
FROM db_user
JOIN (
select db_comment_id as maxId, db_user_id, text
from db_comment
order by db_comment_id desc
limit 1
) as db_comment ON db_comment.db_user_id = db_user.db_user_id
ORDER BY db_user.db_user_id DESC`
SELECT
db_user.name
, db_comment1.text
FROM
db_comment db_comment1
LEFT JOIN
db_comment db_comment2
ON
db_comment1.db_user_id = db_comment2.db_user_id
AND
db_comment1.db_comment_id < db_comment2.db_comment_id
INNER JOIN
db_user
ON
db_comment1.db_user_id = db_user.db_user_id
WHERE
db_comment2.db_user_id IS NULL
| name | text |
|-------|----------------|
| Ivan | Message3 ivan |
| Petr | Message3 Petr |
| Artur | Message2 Artur |
| John | Message2 John |