在这篇文章中,我们将带领您了解mysqlLEFT连接以获取右表的最大值的全貌,包括mysql右连接查询的相关情况。同时,我们还将为您介绍有关101-mysqlleftjoin一对多,取右表最新一条记录
在这篇文章中,我们将带领您了解mysql LEFT连接以获取右表的最大值的全貌,包括mysql右连接查询的相关情况。同时,我们还将为您介绍有关101-mysql left join 一对多,取右表最新一条记录、MySQL left join 右表是一个子查询查询非常慢 (右表的子查询本身查询很快,原来的查询没有加那一个子查询的话也很快的)、mysql 往表中 insert 的时候如何让主键 id 按当前表的最大值自动增长?、MYSQL 查询以显示按内连接列分组的列的最大值的知识,以帮助您更好地理解这个主题。
本文目录一览:- mysql LEFT连接以获取右表的最大值(mysql右连接查询)
- 101-mysql left join 一对多,取右表最新一条记录
- MySQL left join 右表是一个子查询查询非常慢 (右表的子查询本身查询很快,原来的查询没有加那一个子查询的话也很快的)
- mysql 往表中 insert 的时候如何让主键 id 按当前表的最大值自动增长?
- MYSQL 查询以显示按内连接列分组的列的最大值
mysql LEFT连接以获取右表的最大值(mysql右连接查询)
我想选择每张只带有评论的照片,并且希望该评论成为ID最大的照片
我尝试了以下方法:
SELECT p.id, p.title, MAX(c.id), c.commentFROM tb_photos AS p LEFT JOIN tb_comments AS c ON p.id=c.photos_id.
它似乎正在工作,但是我想知道是否有更好的方法可以做到这一点?
答案1
小编典典您需要在每张照片上应用max(评论ID)(假设评论ID是自动递增的,因此总是将最新添加到表格中)
select p.*, tbc.Comment from tb_photos p LEFT JOIN ( select c.photos_id, max( c.id ) lastCommentPerPhoto from tb_comments c group by c.photos_id order by c.Photos_id ) LastPhotoComment on p.id = LastPhotoComment.photos_id LEFT JOIN tb_comments tbc on LastPhotoComment.LastCommentPerPhoto = tbc.id
101-mysql left join 一对多,取右表最新一条记录
SELECT
a.*,
e.userName as chatUser,
e.content as content,
e.chatTime as chatTime
FROM
gp_group AS a
LEFT JOIN (
SELECT b.* FROM chat_content b
LEFT JOIN (
SELECT MAX(c.id) AS id, c.groupUnid FROM chat_content c GROUP BY c.groupUnid
) AS d ON d.groupUnid = b.groupUnid
WHERE b.id = d.id
) AS e ON a.id = e.groupUnid
where 1=1
<if test="qo.status != null" >
and a.status = #{qo.status}
</if>
order by e.chatTime desc
MySQL left join 右表是一个子查询查询非常慢 (右表的子查询本身查询很快,原来的查询没有加那一个子查询的话也很快的)
MySQL left join 右表是一个子查询查询非常慢 (右表的子查询本身查询很快,原来的查询没有加那一个子查询的话也很快的)
请问,这是什么原因,子查询作右表示本来就会很慢的吗?
mysql 往表中 insert 的时候如何让主键 id 按当前表的最大值自动增长?
示例:
create table _yang_test(id BIGINT PRIMARY KEY,name VARCHAR(50));
select @a:=@a+1 as new_id,id,name from _yang_test p,(select @a:=max(id) from _yang_test ) r ;
上面的 new_id 就是你想拿到的 id。
本人在实际项目中的应用:
insert into srba_login
select @a:=@a+1 as id,a.sa_id,a.code as name,16 as account_type,null as last_login_time,null as last_login_ip,
1 as type,CONCAT(NOW(),''初始化统一社会信用代码'') as remark,1 as status,0 as deleted,1 as insert_sa_id,NOW() as insert_time,null as update_sa_id,null as update_time,''10.3.1.108'' as ip
from srba_organ_member a LEFT JOIN srba_login_count b on a.sa_id = b.sa_id and a.code = b.name ,(select @a:=max(id) from srba_login where id <300000) r
where b.id is null and LENGTH(a.code)=18
MYSQL 查询以显示按内连接列分组的列的最大值
如何解决MYSQL 查询以显示按内连接列分组的列的最大值?
我有两张桌子
飞行员
pilot_id | 名字 | 姓氏 | 状态 | 中心 |
---|---|---|---|---|
1 | fname1 | lname1 | 1 | YBBN |
2 | fname2 | lname2 | 0 | YSSY |
3 | fname3 | lname3 | 1 | YMML |
4 | fname4 | lname4 | 1 | YBBN |
5 | fname5 | lname5 | 1 | EGLL |
6 | fname6d> | lname6d> | 1 | EGLL |
7 | fname7 | lname7 | 1 | EGLL |
8 | fname8 | lname8 | 1 | YPAD |
PIREPS
pirep_id | pilot_id | 日期 | 登陆率 | 接受 |
---|---|---|---|---|
1 | 1 | 2021-04-01 | -113 | 1 |
2 | 1 | 2021-04-02 | -110 | 1 |
3 | 1 | 2021-04-03 | -200 | 1 |
4 | 2 | 2021-04-04 | -20 | 1 |
5 | 2 | 2021-04-05 | -120 | 1 |
6 | 3 | 2021-04-06 | -130 | 1 |
7 | 3 | 2021-04-07 | -132 | 1 |
8 | 4 | 2021-04-08 | -91 | 1 |
9 | 5 | 2021-04-09 | -64 | 1 |
10 | 6 | 2021-04-10 | -47 | 0 |
11 | 6 | 2021-04-11 | -112 | 1 |
12 | 7 | 2021-04-12 | -113 | 1 |
13 | 7 | 2021-04-13 | -201 | 1 |
14 | 1 | 2021-04-14 | -300 | 0 |
15 | 1 | 2021-04-15 | -301 | 1 |
预期结果
pilot_id | 名字 | 姓氏 | 中心 | 登陆率 | 日期 | pirep_id |
---|---|---|---|---|---|---|
2 | fname2 | lname2 | YSSY | -20 | 2021-04-04 | 4 |
5 | fname5 | lname5 | EGLL | -64 | 2021-04-09 | 9 |
4 | fname4 | lname4 | YBBN | -91 | 2021-04-08 | 8 |
3 | fname3 | lname3 | YMML | -130 | 2021-04-06 | 6 |
8 | fname8 | lname8 | YPAD | -301 | 2021-04-15 | 15 |
如果我仅按飞行员 ID 分组并显示与相关飞行员的最佳着陆率以及他们完成飞行的日期,则以下代码为我提供了预期的输出
SELECT pi.first_name,pi.last_name,p.pirep_id,p.pilot_id,p.date,p.landing_rate
FROM qvi_pireps p
LEFT JOIN qvi_pilots pi on p.pilot_id=pi.pilot_id
INNER JOIN
(SELECT pilot_id as pil,date as da,MAX(landing_rate) AS max_landing_rate
FROM qvi_pireps
where landing_rate<0 GROUP BY pilot_id) grouppedp
ON p.pilot_id = grouppedp.pil
AND p.landing_rate = grouppedp.max_landing_rate
where pi.status=1 and
accepted=1
group by p.pilot_id ORDER BY `grouppedp`.`max_landing_rate` DESC,p.date asc limit 20
高于查询输出
名字 | 姓氏 | pirep_id | pilot_id | 日期 | 登陆率 |
---|---|---|---|---|---|
fname2 | lname2 | 4 | 2 | 2021-04-04 | -20 |
fname5 | lname5 | 9 | 5 | 2021-04-09 | -64 |
fname4 | lname4 | 8 | 4 | 2021-04-08 | -91 |
fname1 | lname1 | 2 | 1 | 2021-04-02 | -110 |
fname6d> | lname6d> | 11 | 6 | 2021-04-11 | -112 |
fname7 | lname7 | 12 | 7 | 2021-04-12 | -113 |
fname3 | lname3 | 6 | 3 | 2021-04-06 | -130 |
fname8 | lname8 | 15 | 8 | 2021-04-15 | -301 |
当我将 group by p.pilot_id
更改为 group by pi.hub
时,我收到了唯一的集线器,但是 Pilot、landing_rate 和 date 与最佳值不匹配
基本上,我想要实现的是获得每个飞行员的 MAX(landing_rate),其中pilot.status=1 & flight.accepted=1,然后按pilot.hub 分组以显示着陆率最高的最佳枢纽与飞行员和他们达到着陆率的日期
任何帮助将不胜感激!
解决方法
这个:
SELECT pilot_id,date,MAX(landing_rate)
FROM qvi_pireps
GROUP BY pilot_id
是无效的 SQL。您按飞行员分组并选择一个日期。哪个日期?该表中每个飞行员都有很多日期。您必须在 date
上应用一些聚合函数才能使其有效。 MySQL 应该在此处引发异常(我相信它会,您是否从作弊模式更改为 SET sql_mode = ''ONLY_FULL_GROUP_BY'';
。这应该是默认设置的,因为情况似乎并非如此,我推测您正在工作使用旧版本的 MySQL。
除了这个以及不适当的外连接和子查询中缺少的 accepted
检查(这可能是您看到不正确日期的主要原因)之外,您的查询看起来还不错。只有在您的主要查询中,您再次按飞行员分组,这完全没有意义。也许你在某个时候重写你的查询时错误地留下了它。更正了您的查询:
SELECT pil.first_name,pil.last_name,pir.pirep_id,pil.pilot_id,pir.date,pir.landing_rate
FROM qvi_pilots pil
JOIN qvi_pireps pir ON pir.pilot_id = pil.pilot_id AND pir.accepted = 1
JOIN
(
SELECT pilot_id,MAX(landing_rate) AS max_landing_rate
FROM qvi_pireps
WHERE accepted = 1
GROUP BY pilot_id
) grouppedp ON grouppedp.pilot_id = pir.pilot_id AND grouppedp.max_landing_rate = pir.landing_rate
WHERE pil.status = 1
ORDER BY pir.landing_rate DESC,pir.date ASC
LIMIT 20;
为了可读性,我更喜欢 IN
子句而不是连接:
SELECT pil.first_name,pir.landing_rate
FROM qvi_pilots pil
JOIN qvi_pireps pir ON pir.pilot_id = pil.pilot_id
AND pir.accepted = 1
AND (pir.pilot_id,pir.landing_rate) IN
(
SELECT pilot_id,MAX(landing_rate)
FROM qvi_pireps
WHERE accepted = 1
GROUP BY pilot_id
)
WHERE pil.status = 1
ORDER BY pir.landing_rate DESC,pir.date ASC
LIMIT 20;
(顺便说一下,NOT EXISTS (<a greater landing rate for the pilot>)
也可以实现。)
在当前的 MySQL 版本中,我们宁愿使用窗口函数来仅访问 qvi_pireps 表一次:
SELECT first_name,last_name,pirep_id,pilot_id,landing_rate
FROM
(
SELECT
pil.first_name,pir.landing_rate,MAX(pir.landing_rate) OVER (PARTITION BY pil.pilot_id) AS max_landing_rate
FROM qvi_pilots pil
JOIN qvi_pireps pir ON pir.pilot_id = pil.pilot_id AND pir.accepted = 1
WHERE pil.status = 1
) with_max_landing_rate
WHERE landing_rate = max_landing_rate
ORDER BY landing_rate DESC,date ASC
LIMIT 20;
更新:对旧 MySQL 版本的查询相同,但针对每个集线器的最佳费率而不是每个试点的最佳费率。
毕竟,这只是意味着我们必须为每个枢纽而不是每个飞行员寻找 MAX(landing_rate)
:
SELECT pil.first_name,pir.landing_rate
FROM qvi_pilots pil
JOIN qvi_pireps pir ON pir.pilot_id = pil.pilot_id
AND pir.accepted = 1
AND (pil.hub,pir.landing_rate) IN
(
SELECT pl.hub,MAX(pr.landing_rate)
FROM qvi_pireps pr
JOIN qvi_pilots pl USING (pilot_id)
WHERE pr.accepted = 1 AND pl.status = 1
GROUP BY pl.hub
)
WHERE pil.status = 1
ORDER BY pir.landing_rate DESC,pir.date ASC
LIMIT 20;
今天的关于mysql LEFT连接以获取右表的最大值和mysql右连接查询的分享已经结束,谢谢您的关注,如果想了解更多关于101-mysql left join 一对多,取右表最新一条记录、MySQL left join 右表是一个子查询查询非常慢 (右表的子查询本身查询很快,原来的查询没有加那一个子查询的话也很快的)、mysql 往表中 insert 的时候如何让主键 id 按当前表的最大值自动增长?、MYSQL 查询以显示按内连接列分组的列的最大值的相关知识,请在本站进行查询。
本文标签: