要从多个表中选择的查询MySQL

要从多个表中选择的查询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

我有两张桌子。我的任务是选择最后一个人的评论

数据库用户(数据库用户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 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 |