在MySQL中向UNION添加条件

凯文

我不确定使用联合是否可以实现我想做的事情,或者我是否需要使用嵌套查询和某种形式的联接。

select c1,c2 from t1
union
select c1,c2 from t2
// with some sort of condition where t1.c1 = t2.c1

例:

t1
| 100 | regular |
| 200 | regular |
| 300 | regular |
| 400 | regular |

t2
| 100 | summer |
| 200 | summer |
| 500 | summer |
| 600 | summer |

Desired Result
| 100 | regular |
| 100 | summer  |
| 200 | regular |
| 200 | summer  |

我已经尝试过类似的方法:

select * from (select * from t1) as q1
inner join
    (select * from t2) as q2 on q1.c1 = q2.c1

但这会将记录合并为一行,如下所示:

| 100 | regular | 100 | summer |
| 200 | regular | 200 | summer |
布莱恩·德米利亚

尝试:

select c1, c2
  from t1
 where c1 in (select c1 from t2)
union all
select c1, c2
  from t2
 where c1 in (select c1 from t1)

根据编辑,尝试以下操作:

MySQL没有WITH子句,该子句允许您多次引用t1和t2子对象。您可能希望将t1和t2都创建为数据库中的视图,以便在单个查询中可以多次将它们分别称为t1和t2。

即便如此,下面的查询实际上还是很糟糕的,如果我们知道您的数据库结构,可能会对其进行很多优化。就是 表的列表,每个表上的所有列及其数据类型,每个表中的一些示例行以及预期的结果。

例如,在您的t1子目录中,您具有使用LESSON表的外部联接,但随后在WHERE子句中有条件(lesson.dayofweek> = 0),该条件自然不允许为空,从而有效地将外部联接转换为内部联接加入。另外,您还有一些子查询,它们仅使用建议使用多个表的条件来检查是否存在Studentid,而实际上并不需要使用这些表来产生所需的结果。但是,如果不了解您的数据库结构和一些示例数据并获得预期的结果,就很难进一步提出建议。

即使如此,我仍然相信以下内容可能会为您提供所需的东西,只是不是最佳的。

select *
  from (select distinct students.student_number as "StudentID",
                        concat(students.first_name, ' ', students.last_name) as "Student",

                        general_program_types.general_program_name as "Program Category",
                        program_inventory.program_code as "Program Code",
                        std_lesson.studio_name as "Studio",
                        concat(teachers.first_name, ' ', teachers.last_name) as "Teacher",

          from lesson_student
          left join lesson
            on lesson_student.lesson_id = lesson.lesson_id
          left join lesson_summer
            on lesson_student.lesson_id = lesson_summer.lesson_id

         inner join students
            on lesson_student.student_number = students.student_number
         inner join studio as std_primary
            on students.primary_location_id = std_primary.studio_id
         inner join studio as std_lesson
            on (lesson.studio_id = std_lesson.studio_id or
               lesson_summer.studio_id = std_lesson.studio_id)

         inner join teachers
            on (lesson.teacher_id = teachers.teacher_id or
               lesson_summer.teacher_id = teachers.teacher_id)
         inner join lesson_program
            on lesson_student.lesson_id = lesson_program.lesson_id
         inner join program_inventory
            on lesson_program.program_code_id =
               program_inventory.program_code_id
         inner join general_program_types
            on program_inventory.general_program_id =
               general_program_types.general_program_id

         inner join accounts
            on students.ACCOUNT_NUMBER = accounts.ACCOUNT_NUMBER
         inner join account_contacts
            on students.ACCOUNT_NUMBER = account_contacts.ACCOUNT_NUMBER

        /** NOTE: the WHERE condition is the only **/
        /** difference between subquery1 & subquery2 **/
         where lesson.dayofweek >= 0 and
         order by students.STUDENT_NUMBER) t1
 where StudentID in
       (select StudentID
          from (select distinct students.student_number as "StudentID",
                                concat(students.first_name,
                                       ' ',
                                       students.last_name) as "Student",

                                general_program_types.general_program_name as "Program Category",
                                program_inventory.program_code as "Program Code",
                                std_lesson.studio_name as "Studio",
                                concat(teachers.first_name,
                                       ' ',
                                       teachers.last_name) as "Teacher",

                  from lesson_student
                  left join lesson
                    on lesson_student.lesson_id = lesson.lesson_id
                  left join lesson_summer
                    on lesson_student.lesson_id = lesson_summer.lesson_id

                 inner join students
                    on lesson_student.student_number =
                       students.student_number
                 inner join studio as std_primary
                    on students.primary_location_id = std_primary.studio_id
                 inner join studio as std_lesson
                    on (lesson.studio_id = std_lesson.studio_id or
                       lesson_summer.studio_id = std_lesson.studio_id)

                 inner join teachers
                    on (lesson.teacher_id = teachers.teacher_id or
                       lesson_summer.teacher_id = teachers.teacher_id)
                 inner join lesson_program
                    on lesson_student.lesson_id = lesson_program.lesson_id
                 inner join program_inventory
                    on lesson_program.program_code_id =
                       program_inventory.program_code_id
                 inner join general_program_types
                    on program_inventory.general_program_id =
                       general_program_types.general_program_id

                 inner join accounts
                    on students.ACCOUNT_NUMBER = accounts.ACCOUNT_NUMBER
                 inner join account_contacts
                    on students.ACCOUNT_NUMBER =
                       account_contacts.ACCOUNT_NUMBER

                /** NOTE: the WHERE condition is the only **/
                /** difference between subquery1 & subquery2 **/
                 where lesson_summer.dayofweek >= 0
                 order by students.STUDENT_NUMBER) t2)
UNION ALL
select *
  from (select distinct students.student_number as "StudentID",
                        concat(students.first_name, ' ', students.last_name) as "Student",

                        general_program_types.general_program_name as "Program Category",
                        program_inventory.program_code as "Program Code",
                        std_lesson.studio_name as "Studio",
                        concat(teachers.first_name, ' ', teachers.last_name) as "Teacher",

          from lesson_student
          left join lesson
            on lesson_student.lesson_id = lesson.lesson_id
          left join lesson_summer
            on lesson_student.lesson_id = lesson_summer.lesson_id

         inner join students
            on lesson_student.student_number = students.student_number
         inner join studio as std_primary
            on students.primary_location_id = std_primary.studio_id
         inner join studio as std_lesson
            on (lesson.studio_id = std_lesson.studio_id or
               lesson_summer.studio_id = std_lesson.studio_id)

         inner join teachers
            on (lesson.teacher_id = teachers.teacher_id or
               lesson_summer.teacher_id = teachers.teacher_id)
         inner join lesson_program
            on lesson_student.lesson_id = lesson_program.lesson_id
         inner join program_inventory
            on lesson_program.program_code_id =
               program_inventory.program_code_id
         inner join general_program_types
            on program_inventory.general_program_id =
               general_program_types.general_program_id

         inner join accounts
            on students.ACCOUNT_NUMBER = accounts.ACCOUNT_NUMBER
         inner join account_contacts
            on students.ACCOUNT_NUMBER = account_contacts.ACCOUNT_NUMBER

        /** NOTE: the WHERE condition is the only **/
        /** difference between subquery1 & subquery2 **/
         where lesson_summer.dayofweek >= 0
         order by students.STUDENT_NUMBER) x
 where StudentID in
       (select StudentID
          from (select distinct students.student_number as "StudentID",
                                concat(students.first_name,
                                       ' ',
                                       students.last_name) as "Student",

                                general_program_types.general_program_name as "Program Category",
                                program_inventory.program_code as "Program Code",
                                std_lesson.studio_name as "Studio",
                                concat(teachers.first_name,
                                       ' ',
                                       teachers.last_name) as "Teacher",

                  from lesson_student
                  left join lesson
                    on lesson_student.lesson_id = lesson.lesson_id
                  left join lesson_summer
                    on lesson_student.lesson_id = lesson_summer.lesson_id

                 inner join students
                    on lesson_student.student_number =
                       students.student_number
                 inner join studio as std_primary
                    on students.primary_location_id = std_primary.studio_id
                 inner join studio as std_lesson
                    on (lesson.studio_id = std_lesson.studio_id or
                       lesson_summer.studio_id = std_lesson.studio_id)

                 inner join teachers
                    on (lesson.teacher_id = teachers.teacher_id or
                       lesson_summer.teacher_id = teachers.teacher_id)
                 inner join lesson_program
                    on lesson_student.lesson_id = lesson_program.lesson_id
                 inner join program_inventory
                    on lesson_program.program_code_id =
                       program_inventory.program_code_id
                 inner join general_program_types
                    on program_inventory.general_program_id =
                       general_program_types.general_program_id

                 inner join accounts
                    on students.ACCOUNT_NUMBER = accounts.ACCOUNT_NUMBER
                 inner join account_contacts
                    on students.ACCOUNT_NUMBER =
                       account_contacts.ACCOUNT_NUMBER

                /** NOTE: the WHERE condition is the only **/
                /** difference between subquery1 & subquery2 **/
                 where lesson.dayofweek >= 0 and
                 order by students.STUDENT_NUMBER) x);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

向MySQL查询添加额外条件

来自分类Dev

向MySQL查询添加更多IF条件

来自分类Dev

向模型中的每个查询添加条件

来自分类Dev

向MySQL查询添加其他条件导致空响应

来自分类Dev

向MySQL查询添加附加条件

来自分类常见问题

如何根据条件向数组中的嵌套对象添加属性

来自分类Dev

如何在剑道中向图表添加条件着色?

来自分类Dev

如何在HAML中向条件添加类

来自分类Dev

在分页查询(CakePHP 2.0.4)中向联接表添加条件

来自分类Dev

如何在SQL函数中向RETURN添加条件?

来自分类Dev

如何根据条件向数组中的嵌套对象添加属性

来自分类Dev

向条件数组中的每个对象添加新值

来自分类Dev

如何在HAML中向条件添加类

来自分类Dev

在 Oracle PL/SQL 中向 WHERE 子句添加条件

来自分类Dev

在R中的某些条件下向表添加行

来自分类Dev

根据数据框中的条件向值添加字符/字母

来自分类Dev

phpmyadmin where mysql union 中的条件出现 sintax 错误

来自分类Dev

SQLAlchemy向查询添加条件

来自分类Dev

无法使用mysql和php向表中添加值

来自分类Dev

如何在MySQL中向当前日期添加小时

来自分类Dev

限制用户每天向mysql中添加新记录

来自分类Dev

PHP - mySQL:向表中添加删除、编辑按钮

来自分类Dev

如何向mysql表中的选择添加逗号

来自分类Dev

如何在有条件的剧本中向条件字典添加键/值

来自分类常见问题

从数组动态向对象添加条件

来自分类Dev

向密码验证JavaScript添加条件

来自分类Dev

Yii2向AssetBundle添加条件

来自分类Dev

向数据框添加条件变量

来自分类Dev

向PL / SQL游标添加条件