【问题标题】:Is there a way to stop writing same subqueries again and again when joining subqueries in MySQL在 MySQL 中加入子查询时,有没有办法停止一次又一次地编写相同的子查询
【发布时间】:2020-01-03 05:11:35
【问题描述】:

我需要完全外部加入这些子查询

SET @n1 = 0; 
SET @n2 = 0; 

SELECT * FROM
(SELECT (@n1:=@n1 + 1) AS n, name FROM occupations WHERE occupation="Doctor") AS t1
LEFT OUTER JOIN
(SELECT (@n2:=@n2 + 1) AS n, name FROM occupations WHERE occupation="Professor") AS t2 
ON t1.n=t2.n
UNION
SELECT * FROM
(SELECT (@n1:=@n1 + 1) AS n, name FROM occupations WHERE occupation="Doctor") AS t1
RIGHT OUTER JOIN
(SELECT (@n2:=@n2 + 1) AS n, name FROM occupations WHERE occupation="Professor") AS t2 
ON t1.n=t2.n
;

在这里,我不得不一次又一次地编写相同的子查询。

如果有像下面这样的方法就很简单了

SET @n1 = 0; 
SET @n2 = 0; 

t1 = (SELECT (@n1:=@n1 + 1) AS n, name FROM occupations WHERE occupation="Doctor");
t2 = (SELECT (@n2:=@n2 + 1) AS n, name FROM occupations WHERE occupation="Professor");

SELECT * FROM  t1 LEFT OUTER JOIN t2 ON t1.n=t2.n
UNION
SELECT * FROM t1 RIGHT OUTER JOIN AS t2 ON t1.n=t2.n;

但我不知道有什么方法可以做这样的事情。此外,我不想创建任何视图或临时表来执行此操作。请帮忙。谢谢。

【问题讨论】:

  • 示例数据在这里会有所帮助。
  • 你使用SELECT (@n1:=@n1 + 1) AS n的目的是什么?
  • 我正在尝试解决hackerrank.com 的问题。我可以解决问题。但是代码太多了。这里link解决问题
  • 你能在这里发布问题(或类似问题)吗?
  • 在 MySQL 中未定义在 select 语句中读取和写入相同的变量,并且从 8 开始已弃用。请参阅手册重新变量和赋值。

标签: mysql join subquery


【解决方案1】:

例如,通常使用 mysql 中的条件聚合来解决枢轴问题

drop table if exists t;
create table t
(name varchar(10), job varchar(10));

insert into t values
('aaa','dr'),
('bbb','plumber'),
('ccc','lab'),
('ddd','dr'),
('eee','plumber'),
('ggg','lab'),
('fff','plumber')
;


select max(case when job = 'dr' then name else null end) dr,
         max(case when job = 'plumber' then name else null end) plumber,
         max(case when job = 'lab' then name else null end) lab
from
(
select name,job,
        if(job <> @p,@rn:=1,@rn:=@rn+1) rn,
        @p:=job p
 from t 
 cross join (select @rn:=0,@p:='') r
 order by job, name
 ) s
 group by rn;

+------+---------+------+
| dr   | plumber | lab  |
+------+---------+------+
| aaa  | bbb     | ccc  |
| ddd  | eee     | ggg  |
| NULL | fff     | NULL |
+------+---------+------+
3 rows in set (0.02 sec)

注意生成行号以启用组(在 8.0 版中,您可以使用 row_number 函数)和按名称排序。

【讨论】:

  • 非常感谢。我不知道这种案例方法。我可以做我想做的事。
【解决方案2】:

我能够做我想做的事。这是我的代码。谢谢大家。

SET @n1 = 0; 
SET @n2 = 0; 
SET @n3 = 0;
SET @n4 = 0;

select t1.name, t2.name, t3.name, t4.name from
(select 
    (@n1:=@n1 + 1) AS n,
    case when occupation = 'Doctor' then name else null end as name
from occupations
order by if(occupation = 'Doctor',0,1), name) as t1,
(select 
    (@n2:=@n2 + 1) AS n,
    case when occupation = 'Professor' then name else null end as name
from occupations
order by if(occupation = 'Professor',0,1), name) as t2,
(select 
    (@n3:=@n3 + 1) AS n,
    case when occupation = 'Singer' then name else null end as name
from occupations
order by if(occupation = 'Singer',0,1), name) as t3,
(select 
    (@n4:=@n4 + 1) AS n,
    case when occupation = 'Actor' then name else null end as name
from occupations
order by if(occupation = 'Actor',0,1), name) as t4
where t1.n=t2.n and t2.n=t3.n and t3.n=t4.n and not(t1.name is null and t2.name is null and t3.name is null and t4.name is null);

【讨论】:

    猜你喜欢
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多