Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 来自同一个表的两个嵌套查询?_Mysql_Sql_Join_Pivot - Fatal编程技术网

Mysql 来自同一个表的两个嵌套查询?

Mysql 来自同一个表的两个嵌套查询?,mysql,sql,join,pivot,Mysql,Sql,Join,Pivot,所以我有三张桌子 用户表 UserId User 语言表 LanguageId Language Fluency UserLanguageId UserId LanguageId 用户语言表 LanguageId Language Fluency UserLanguageId UserId LanguageId 基本上我需要的是一个查询,其中PriLang是Fluence='Primary',SecLang是Fluence='Secondary',看起来像这样 +-----------

所以我有三张桌子

用户表

UserId User
语言表

LanguageId Language Fluency
UserLanguageId UserId LanguageId
用户语言表

LanguageId Language Fluency
UserLanguageId UserId LanguageId
基本上我需要的是一个查询,其中PriLang是Fluence='Primary',SecLang是Fluence='Secondary',看起来像这样

+------------+-----------------+-----------+
| User       | PriLang         | SecLang   |
+------------+-----------------+-----------+
| Jimbo      | English         | Spanish   |
+------------+-----------------+-----------+
| Norm       | French          | Spanish   |
+------------+-----------------+-----------+
| Kathy      | Japanese        | Italian   |
+------------+-----------------+-----------+

一个选项使用条件聚合:

select 
    u.user,
    max(case when l.fluency = 'Primary' then l.language end) as pri_lang,
    max(case when l.fluency = 'Secondary' then l.language end) as sec_lang
from users u 
left join user_languages ul on ul.user_id = u.user_id
left join languages l on l.language_id = ul.language_id
group by u.user_id, u.user

根据您的设置,可能会出现类似的情况;这应该可以让您通过以下方式接近:


在我看来,最直接的方法涉及到两个到user_languages表的连接,以及每个连接到langauges表的连接

select  usr.User, lg1.Language PriLang, lg2.Language SecLang 
from users usr
 left join user_languages ul1
  on ul1.userId = usr.userId
   and ul1.Fluency='Primary'
 left join user_languages ul2
  on ul2.userId = usr.userId
   and ul2.Fluency='Secondary'
 left join languages lg1
  on lg1.languageId = ul1.languageId
 left join languages lg2
  on lg2.languageId = ul2.languageId

这将不会返回正确的结果。您必须将在线查询与用户关联起来,如
所示,其中Language\u Fluency='Primary'和userID=u.userID
谢谢;为了便于我理解相关子查询,我们是否必须链接
WHERE
子句中的其他两个表,或者只链接一个表?@tlk27:Infact只需删除整个join子句,并在内联查询中引用user_id和其他筛选器即可。@tlk27:只需更新您,我建议对问题进行一些修改,1。语言_表只能在内联查询2中获取一次。当我们将内联查询作为列时,我们不需要左连接,而只需要简单的连接就足够了,因为如果连接条件匹配,它将返回结果或null。@Sujitmohanty30感谢您的知识和建议。我感谢您花时间提供改进此解决方案所需的信息和见解。谢谢,工作完全符合预期。我不知道你在ul2下也能像在那里一样流利。很高兴我能帮上忙!