首页 > 解决方案 > 用于连接 3 个表的 SQL 查询,产生一个有序和排序的列表

问题描述

我如何编写一个查询来连接 3 个表,从而产生一个有序和排序的列表?


我有 3 个具有以下结构的表:

表用户:

|---------------------------|
|           Users           |
|---------------------------|
|      ID     |     Name    |
|-------------|-------------|
|      1      |     John    |
|-------------|-------------|
|      2      |     David   |
|-------------|-------------|
|      3      |     James   |
|-------------|-------------|
|      4      |     Jack    |
|-------------|-------------|

表问题:

|-------------------------------------------------------|
|                    Questions                          |
|-------------------------------------------------------|
|   ID  |     Question                                  |
|-------|-----------------------------------------------|
|   1   |     How old are you working in this company?  |
|-------|-----------------------------------------------|
|   2   |     How many customers do you notice?         |
|-------|-----------------------------------------------|
|   3   |     What is your salary?                      |
|-------|-----------------------------------------------|
|   4   |     Do you speak another language?            |
|-------|-----------------------------------------------|

表回复

|----------------------------------------|
|                  Replies               |
|----------------------------------------|
|  ID | USER ID | QUESTION ID |   Reply  |
|-----|---------|-------------|----------|
|  1  |    1    |      1      |    10    |
|-----|---------|-------------|----------|
|  2  |    1    |      2      |    30    |
|-----|---------|-------------|----------|
|  3  |    1    |      3      |    3000  |
|-----|---------|-------------|----------|
|  4  |    1    |      4      |    yes   |
|-----|---------|-------------|----------|
|  5  |    2    |      1      |    7     |
|-----|---------|-------------|----------|
|  6  |    2    |      2      |    25    |
|-----|---------|-------------|----------|
|  7  |    2    |      3      |    1500  |
|-----|---------|-------------|----------|
|  8  |    2    |      4      |    no    |
|-----|---------|-------------|----------|
|  9  |    3    |      1      |    5     |
|-----|---------|-------------|----------|
|  10 |    3    |      2      |    50    |
|-----|---------|-------------|----------|
|  11 |    3    |      3      |    2000  |
|-----|---------|-------------|----------|
|  12 |    3    |      4      |    yes   |
|-----|---------|-------------|----------|
|  13 |    4    |      1      |    7     |
|-----|---------|-------------|----------|
|  14 |    4    |      2      |    40    |
|-----|---------|-------------|----------|
|  15 |    4    |      3      |    2000  |
|-----|---------|-------------|----------|
|  16 |    4    |      4      |    yes   |
|-----|---------|-------------|----------|

我需要编写一个 SQL 查询来过滤和排序这些结果。几乎就像一个Excel。



示例:我需要选择谁会说另一种语言,谁为 5 到 100 个客户提供服务,订购递减的公司的薪水和年限。</p>

结果应该是这样的:

|--------------------------------------------------------------------|
|                            Result                                  |
|--------------------------------------------------------------------|
| ORDER |  NAME  | QUESTION 1 | QUESTION 2 | QUESTION 3 | QUESTION 4 |
|-------|--------|------------|------------|------------|------------|
|   1   |  John  |     10     |     30     |    3000    |     Yes    |
|-------|--------|------------|------------|------------|------------|
|   2   |  Jack  |     7      |     40     |    2000    |     Yes    |
|-------|--------|------------|------------|------------|------------|
|   3   |  James |     5      |     50     |    2000    |     Yes    |
|-------|--------|------------|------------|------------|------------|

有什么建议么?

谢谢

标签: mysqlsql

解决方案


使用条件聚合JOIN进行:

select u.user_id, u.name,
       max(case when r.QUESTIONID = 1 then r.reply) as QUESTION1,
       max(case when r.QUESTIONID = 2 then r.reply) as QUESTION2,
       max(case when r.QUESTIONID = 3 then r.reply) as QUESTION3,
       max(case when r.QUESTIONID = 4 then r.reply) as QUESTION4
from Replies r inner join 
     Users u
     on u.user_id = r.user_id
group by u.user_id, u.name;

编辑 :

select t.*
from ( <query> ) t
where . . .;

推荐阅读