繁体   English   中英

如何通过条件查询(左联接/右联接/内部联接/多选择,…或)从多表中获取数据

[英]How to fetch data by a conditional query(left join/right join/inner join/ multi select, … or) from multi table

我有条件查询的问题,无法解决,需要您的帮助。 我将MySQL与innodb结合使用,并且有一些类似波纹管的表。

table1:---------------------- uers_type_1 ----------------------

user_id int(11) primary auto_increment
firstname varchar(15)
lastname varchar(20)
.
.
.

表2:---------------------- uers_type_2 ----------------------

user_id int(11) primary auto_increment
firstname varchar(15)
lastname varchar(20)
.
.
.

表3:---------------------- user_request ----------------------

request_id int(11) primary auto_increment
user_type enum("ut1","ut2")
user_id int(11)
request text

现在,我需要一个查询来获取如下内容:用户从用户类型表中请求具有用户名和姓氏的数据

结果:

-----------------------------------------------
- firstName - lastName - request_id - request -
-----------------------------------------------
- Robert    - De Niro  - 10         - some request.
- Will      - Smith    - 93         - some request.
.
.
.

我的查询像这样,但不起作用

SELECT r.request_id , r.request, (
 execute(
  concat('select u.first_name AS firstName, u.lastname AS lastName from ', 
           (SELECT CASE r.user_type WHEN 'ut1' 
           THEN 'uers_type_1' WHEN 'ut2' THEN 'uers_type_2' END), 
           ' u WHERE u.user_id = ', r.user_id, ''
  )
 )
)
FROM `user_request` r
WHERE 1

我为您解决了问题,

select user_request.r_id , user_request.request,
(select Case user_request.user_type when 'u1' then user_type_1.fistname else user_type_2.firstname end ) as name
from user_request 
left JOIN user_type_1 on user_request.user_id = user_type_1.id and user_request.user_type = 'u1' 
left JOIN user_type_2 on user_request.user_id = user_type_2.id and user_request.user_type = 'u2' 

关键是:尝试使用左联接指向查询中的两个表,然后在选择选项中选择应在何处获取数据。

(select Case user_request.user_type when 'u1' then user_type_1.firstname else user_type_2.firstname end ) as name,
(select Case user_request.user_type when 'u1' then user_type_1.lastname else user_type_2.lastname end ) as family

希望对您有所帮助。

有2个用户表会使您感到困惑和沮丧。 虽然我不知道为什么要拥有它们,但考虑将它们移到单个表中。 在任何情况下,都可以使用UNION ALL查询生成用户信息的单个视图,例如:

  SELECT
        'ut1' AS user_type
      , user_id
      , firstname
      , lastname
  FROM user_type_1
  UNION ALL
  SELECT
        'ut2' AS user_type
      , user_id
      , firstname
      , lastname
  FROM user_type_2
  ;

该查询实际上可以用于创建view但是它是可选的。 UNION ALL方法可以用作如下查询中的derived table子查询。 请注意,这如何简化对名称列的访问。

  SELECT
        user_request.r_id
      , user_request.request
      , u.firstname                ## simple to access
      , u.lastname                 ## simple to access
  FROM user_request AS ur
  INNER JOIN (
        SELECT
              'ut1' AS user_type
            , user_id
            , firstname
            , lastname
        FROM user_type_1
        UNION ALL
        SELECT
              'ut2' AS user_type
            , user_id
            , firstname
            , lastname
        FROM user_type_2
  ) AS u ON ur.user_type = u.user_type
        AND ur.user_id = u.user_id
  ;

另一种选择是使用2个左联接,每个用户表一个,并将user_type作为联接的条件包括在每个联接中。 请注意,由于左联接的工作方式,此处的名称可以为NULL,因此您可以通过使用COALESCE()IFNULL()来克服该问题。

  SELECT
        ur.r_id
      , ur.request
      , COALESCE(ut1.fistname,ut2.firstname) firstname
      , COALESCE(ut1.lastname,ut2.lastname) lastname
  FROM user_request as ur
  LEFT JOIN user_type_1 as ut1 ON ur.user_id = ut1.id
        AND ur.user_type = 'ut1'
  LEFT JOIN user_type_2 as ut2 ON ur.user_id = ut2.id
        AND ur.user_type = 'ut2'
  ;

如果您应该选择创建视图,例如

CREATE OR REPLACE VIEW users_all_v
AS
  SELECT
        'ut1' AS user_type
      , user_id
      , firstname
      , lastname
  FROM user_type_1
  UNION ALL
  SELECT
        'ut2' AS user_type
      , user_id
      , firstname
      , lastname
  FROM user_type_2
  ;

然后,后续查询变得更易于组装,例如

  SELECT
        user_request.r_id
      , user_request.request
      , u.firstname                ## simple to access
      , u.lastname                 ## simple to access
  FROM user_request AS ur
  INNER JOIN users_all_v AS u ON ur.user_type = u.user_type
        AND ur.user_id = u.user_id
  ;

并且,即使您有一天将这两个用户表合并为1,也可以调整该视图,而现有查询不会中断。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM