关于mysql多表关联查询的问题

老王就是我 网站后台开发员  2021-04-22 10:24:48
假设有一张表,结构为

create table user_info{
id int primary key,
name varchar(20)
}

create table order_info{
id int primary key,
order_user_id int,
examine_user_id int
}

user_info是用户表,order_info通过order_user_id 、examine_user_id 关联用户表,现在我的需求是,只查询一次user_info,要分别查询出order_user_id和examine_user_id 所对应的用户名
类似

select

from
user_info user_info ,order_info order_info

请问sql要怎么写?
...全文
2026 点赞 收藏 22
写回复
22 条回复
老王就是我 04月27日
引用 22 楼 s478853630 的回复:
order_info加两个冗余字段存入用户名,user_info一次都不用查,毫无疑问是效率最高的, 只不过user_info的的name改了,冗余字段得跟着改, 为了提高效率(特别是用户体验),我不怕维护麻烦, 当数据达到千百万的时候就更应该这样了,海量数据再join肯定慢(且不提分库分表),单表查询快
数据表已经是这样的设计了,不可能改的
回复 点赞
s478853630 04月27日
order_info加两个冗余字段存入用户名,user_info一次都不用查,毫无疑问是效率最高的, 只不过user_info的的name改了,冗余字段得跟着改, 为了提高效率(特别是用户体验),我不怕维护麻烦, 当数据达到千百万的时候就更应该这样了,海量数据再join肯定慢(且不提分库分表),单表查询快
回复 点赞
sbgf5678 04月25日
sql新手,学习了
回复 点赞
xiaoxiangqing 04月25日
10楼的就可以
回复 点赞
heyingss 04月24日
关联查询,子查询都可以的。
回复 点赞
JonsenTang 04月24日
试试触发器呢
回复 点赞
老王就是我 04月23日
引用 15 楼 James灬Gosling 的回复:
[quote=引用 14 楼 老王就是我 的回复:][quote=引用 13 楼 James灬Gosling 的回复:]SELECT c.id, max(c.name), max(c.examname) FROM ( select a.id, case when a.order_user_id = b.id then b.name end as name, case when a.examine_user_id = b.id then b.name end as examname from order_info a left join user_info b on a.order_user_id = b.id or a.examine_user_id = b.id) AS c GROUP BY c.id 我还有这种骚写法 你看你喜欢用哪个
子查询或者多查一次user表,我觉得效率太低才没这么搞(说实话,主要是太low),但我问了一圈,好像只有两种写法,要么关联查询多查一次,要么在select子查询[/quote] 你为什么会觉得效率低呢,你看了执行计划了吗[/quote] 如果能实现我那种需求,执行效率比查询两次select语句(或者两个表)要高。虽然我想不出来
回复 点赞
James灬Gosling 04月22日
SELECT
a.name
FROM
user_info AS a
INNER JOIN order_info AS b ON a.id = b.order_user_id
or a.id = b.examine_user_id
回复 点赞
老王就是我 04月22日
引用 4 楼 极客诗人 的回复:
关联表肯定作为业务驱动表, 两个join分别关联对应的order_user_id和examine_user_id
具体要怎么写呢?user_info只能用一次来着
回复 点赞
极客诗人 04月22日
关联表肯定作为业务驱动表, 两个join分别关联对应的order_user_id和examine_user_id
回复 点赞
老王就是我 04月22日
引用 1 楼 James灬Gosling 的回复:
需求不清晰 111
但是user_info 只能用一次
回复 点赞
老王就是我 04月22日
引用 1 楼 James灬Gosling 的回复:
需求不清晰 111
就是查询出order_user_id和examine_user_id所对应的用户名
回复 点赞
James灬Gosling 04月22日
需求不清晰 111
回复 点赞
James灬Gosling 04月22日
引用 14 楼 老王就是我 的回复:
[quote=引用 13 楼 James灬Gosling 的回复:]SELECT c.id, max(c.name), max(c.examname) FROM (
select
a.id,
case when a.order_user_id = b.id then b.name end as name,
case when a.examine_user_id = b.id then b.name end as examname
from order_info a
left join user_info b on a.order_user_id = b.id or a.examine_user_id = b.id) AS c GROUP BY c.id



我还有这种骚写法 你看你喜欢用哪个

子查询或者多查一次user表,我觉得效率太低才没这么搞(说实话,主要是太low),但我问了一圈,好像只有两种写法,要么关联查询多查一次,要么在select子查询[/quote]




你为什么会觉得效率低呢,你看了执行计划了吗
回复 点赞
老王就是我 04月22日
引用 13 楼 James灬Gosling 的回复:
SELECT c.id, max(c.name), max(c.examname) FROM ( select a.id, case when a.order_user_id = b.id then b.name end as name, case when a.examine_user_id = b.id then b.name end as examname from order_info a left join user_info b on a.order_user_id = b.id or a.examine_user_id = b.id) AS c GROUP BY c.id 我还有这种骚写法 你看你喜欢用哪个
子查询或者多查一次user表,我觉得效率太低才没这么搞(说实话,主要是太low),但我问了一圈,好像只有两种写法,要么关联查询多查一次,要么在select子查询
回复 点赞
James灬Gosling 04月22日
SELECT c.id, max(c.name), max(c.examname) FROM (
select
a.id,
case when a.order_user_id = b.id then b.name end as name,
case when a.examine_user_id = b.id then b.name end as examname
from order_info a
left join user_info b on a.order_user_id = b.id or a.examine_user_id = b.id) AS c GROUP BY c.id



我还有这种骚写法 你看你喜欢用哪个
回复 点赞
nayi_224 04月22日
10楼的就是正确写法。不过你要只是想玩一玩的话,也能写出来,只是要用oracle

select t2.*,
       t1.name,
       t1.name2
  from (
select t1.id,
       t1.name,
       prior t1.id id2,
       prior t1.name name2
  from (
select t1.*,
       count(1) over() cot
  from user_info t1
) t1
 connect by level < cot
) t1,
  order_user t2
 where t1.id = t2.order_user_id
   and t1.id2 = t2.examine_user_id
回复 点赞
James灬Gosling 04月22日
老铁有没有兴趣来扣扣群
回复 点赞
James灬Gosling 04月22日
SELECT
b.name, c.name
FROM
order_info AS a
INNER JOIN user_info AS b ON b.id = a.order_user_id
INNER JOIN user_info AS c ON c.id = a.examine_user_id



只使用一次user_info 貌似不是很好做到 你看下我这个是否可以满足
回复 点赞
老王就是我 04月22日
引用 8 楼 James灬Gosling 的回复:
[quote=引用 7 楼 老王就是我 的回复:][quote=引用 6 楼 James灬Gosling 的回复:]SELECT a.name FROM user_info AS a INNER JOIN order_info AS b ON a.id = b.order_user_id or a.id = b.examine_user_id
额,我是说要弄两列出来 user_info.name as 'orderUserName', user_info.name as 'examineUserName'、 这样的[/quote] 所以我就说你需求不说清楚,你这六年的CSDN号是咋来的,需求都描述不清楚[/quote] 分别查出,而不是一起查出
回复 点赞
发动态
发帖子
Java EE
创建于2007-09-28

3.7w+

社区成员

22.5w+

社区内容

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区公告
暂无公告