![](/img/trans.png)
[英]SQL query to select distinct rows from left table after inner join to the right table
[英]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.