在单个select语句中连接多个表

时间:2013-11-03 20:45:38

标签: select union

SELECT user_id as user_id, CONCAT(first_name,' ',last_name) as name
FROM users u
WHERE (first_name like '%r%' or last_name like '%r%') 

UNION

SELECT provider_id as provider_id, provider_name as name
FROM providers
WHERE ( provider_name like '%r%')

使用上述查询我

user_id name
5        Richard
6        Rowen
12       Riley
21       Rowen providers

Rowen提供程序的provider_id为21.但列名为user_id。如何为provider_id获取不同的列名?

2 个答案:

答案 0 :(得分:0)

您可以将列拆分为两个,并在无法获得实际值的地方提供假值:

SELECT '' as provider_id, user_id as user_id, CONCAT(first_name,' ',last_name) as name
FROM users u
WHERE (first_name like '%r%' or last_name like '%r%') 

UNION

SELECT provider_id as provider_id, '' as user_id, provider_name as name
FROM providers
WHERE ( provider_name like '%r%')

答案 1 :(得分:0)

由于您正在进行联合,因此第二个查询将从第一个查询继承列名。这导致您的数据在执行后不准确。如果我是你,我会做一个JOIN而不是UNION。这将保留第二个查询的列名称,并以易于阅读的方式显示数据。对于作为提供者的行,用户信息将为NULL,对于作为用户的行,提供者信息将为NULL。我能给你的最好建议是尽可能不在一列中组合两种不同类型的数据。 User_Id和Provider_Id不应位于同一列中,因为它们具有不同的含义。

尝试:

SELECT u.user_id, CONCAT(u.first_name,' ',u.last_name) as user_name,
       p.provider_id, p.provider_name
FROM users u, providers p
WHERE (u.first_name like '%r%' or u.last_name like '%r%') or
      (p.provider_name like '%r%')
相关问题