左联接的行为与MySQL中的空值不同

原学程将引见左连接的行动与MySQL中的空值分歧的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。

左联接的行为与MySQL中的空值不同 教程 第1张

成绩描写

我正在从HackerRank完成this challenge。

它会问:

透望职业中的职业列,以就每一个称号按字母次序排序,并显示在其对于应的职业下。输入列题目应分离为专士、传授、歌脚以及演员。

它触及以下数据表:

Name OccupationAshleyProfessor 
Samantha Actor 
JuliaDoctor 
Britney  Professor 
Maria  Professor 
Meera Professor 
PriyaDoctor 
Priyanka Professor 
Jennifer  Actor 
KettyActor 
Belvet Professor 
Naomi Professor 
Jane Singer 
Jenny Singer 
Kristeen Singer 
Christeen Singer 
Eve Actor 
Aamina Doctor

我们愿望按Occupation透望此表,以就每一个称号按字母次序排序并显示在其对于应的职业下。输入列题目(现实上没有是)应当分离是Doctor、Offer、Singer以及Actor。

然则,当我运转此MySQL代码时:

SELECT d.name, p.name, s.name, a.name 
FROM (
 SELECT @row_number:=@row_number+一 AS row_number, Name
 FROM OCCUPATIONS, (SELECT @row_number:=0) AS t
 WHERE Occupation = 'Professor'
 ORDER BY Name
 ) p
LEFT JOIN (
 SELECT @row_number:=@row_number+一 AS row_number, Name
 FROM OCCUPATIONS, (SELECT @row_number:=0) AS t
 WHERE Occupation = 'Doctor'
 ORDER BY Name
 ) d ON d.row_number =p.row_number
LEFT JOIN (
 SELECT @row_number:=@row_number+一 AS row_number, Name
 FROM OCCUPATIONS, (SELECT @row_number:=0) AS t
 WHERE Occupation = 'Singer'
 ORDER BY Name
 ) s ON p.row_number =s.row_number
LEFT JOIN (
 SELECT @row_number:=@row_number+一 AS row_number, Name
 FROM OCCUPATIONS, (SELECT @row_number:=0) AS t
 WHERE Occupation = 'Actor'
 ORDER BY Name
 ) a ON p.row_number =a.row_number

LEFT JOIN%s的行动没有相符预期,我支到:

NULL Ashley NULL NULL 
NULL Belvet NULL NULL 
NULL Britney NULL NULL 
NULL Maria NULL NULL 
NULL Meera NULL NULL 
NULL Naomi NULL NULL 
NULL Priyanka NULL NULL

这对于我去说出成心义--为何衔接会死成这么多空值?MySQL的行动方法能否使您不克不及对于多个表停止编号?我没有清晰。

推举谜底

我以为它出有以您以为的方法婚配的缘由是@row_number出无为每一身材盘问重置为一。

我尝试了它,只是参加了前二个(传授以及大夫),但是应用了穿插衔接,如许我便不妨瞅到一切的ROW_NUMBER值。

+------------+--------+------------+----------+
| row_number | name| row_number | name  |
+------------+--------+------------+----------+
| 8 | Aamina | 一 | Ashley|
| 8 | Aamina | 二 | Belvet|
| 8 | Aamina | 三 | Britney  |
| 8 | Aamina | 四 | Maria |
| 8 | Aamina | 五 | Meera |
| 8 | Aamina | 六 | Naomi |
| 8 | Aamina | 七 | Priyanka |
| 九 | Julia  | 一 | Ashley|
| 九 | Julia  | 二 | Belvet|
| 九 | Julia  | 三 | Britney  |
| 九 | Julia  | 四 | Maria |
| 九 | Julia  | 五 | Meera |
| 九 | Julia  | 六 | Naomi |
| 九 | Julia  | 七 | Priyanka |
|一0 | Priya  | 一 | Ashley|
|一0 | Priya  | 二 | Belvet|
|一0 | Priya  | 三 | Britney  |
|一0 | Priya  | 四 | Maria |
|一0 | Priya  | 五 | Meera |
|一0 | Priya  | 六 | Naomi |
|一0 | Priya  | 七 | Priyanka |
+------------+--------+------------+----------+

您不妨瞅到,言号明显是递加的,而且在对于言停止编号时,二身材盘问中的初初值一曾经完成。

您或者许可以或许经由过程在每一身材盘问中应用分歧的用户变质去修复此成绩。

但是此盘问不管怎样皆没有会以您愿望的方法任务,比方,假如您的传授比其余职业的成员少。

诚实说,我没有会在SQL中停止这类列格局树立。只需履行4个自力的盘问,将一切成果提与到您的运用法式中,并在输入时将其格局化为列。如许会简略患上多,简略的代码更易编辑、更易调试、更易保护。


请答复您的批评:

很公正,只需您(以及其余读者)晓得在现实项目中,编辑过于奇妙的SQL其实不老是最佳的主张,这么将其作为编码挑衅是不妨接收的。

由于您正在停止编码挑衅,所以您应当本身处理它,所以我不克不及给您供给发生以下输入的处理计划。但是这证实了这是能够的(我包管我出有模仿输入,我真的从我的终端窗心复制以及粘贴了它)。祝您佳运!

+------------+-----------+--------+-----------+----------+
| row_number | Professor | Doctor | Singer | Actor |
+------------+-----------+--------+-----------+----------+
| 一 | Ashley | Aamina | Christeen | Eve|
| 二 | Belvet | Julia  | Jane| Jennifer |
| 三 | Britney| Priya  | Jenny  | Ketty |
| 四 | Maria  | NULL| Kristeen  | Samantha |
| 五 | Meera  | NULL| NULL| NULL  |
| 六 | Naomi  | NULL| NULL| NULL  |
| 七 | Priyanka  | NULL| NULL| NULL  |
+------------+-----------+--------+-----------+----------+

佳了闭于左连接的行动与MySQL中的空值分歧的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。