从单独行中的多个表中选择

时间:2018-09-20 13:30:28

标签: mysql sql

我的网站上具有搜索功能,您可以在其中搜索用户和位置。我正在尝试使其在一个查询中获得所有结果,但它会在一行中返回结果。

SQL

SELECT users.f_name, users.l_name, users.id, locations.name, locations.id
FROM users, locations
WHERE CONCAT(f_name, ' ', l_name) LIKE '%k%' OR name LIKE '%k%';

但是,这是它返回的结构:

*---------*----------*------*------------*-----*
| f_name  |  l_name  |  id  |    name    | id  |
*---------*----------*------*------------*-----*
|  Joe    |  Smith   |   1  |  Location  |  1  |
*---------*----------*-------------------*-----*
etc.

我希望它返回此值:

*---------*----------*------*------------*--------*
| f_name  |  l_name  |  id  |    name    |   id   |
*---------*----------*------*------------*--------*
|  Joe    |  Smith   |   1  |    NULL    |  NULL  |
|  NULL   |   NULL   | NULL |  Location  |    1   |
*---------*----------*------*------------*--------*

我唯一的选择是进行两个单独的查询并合并结果。这样做似乎效率低下,而且由于它是用ajax动态加载的,所以我希望它尽快。

最好的方法是什么?

编辑

表结构如下:

users
*---------*----------*------*
| f_name  |  l_name  |  id  |
*---------*----------*------*

locations
*-------*------*
| name  |  id  |
*-------*------*

2 个答案:

答案 0 :(得分:3)

不确定为什么要这样的数据,但这将在1个查询中为您完成。

使用UNION,匹配列中的数据类型和列名必须相同。

SELECT users.f_name, users.l_name, users.id AS UserID, NULL AS name, NULL AS LocationId
FROM users
WHERE CONCAT(f_name, ' ', l_name) LIKE '%k%' 
UNION ALL 
SELECT NULL AS f_name, NULL AS l_name, NULL AS Userid, locations.name, locations.id AS LocationId
FROM locations 
WHERE name LIKE '%k%'

答案 1 :(得分:0)

union all应该做您想要的:

select u.f_name, u.l_name, u.id, NULL as name, NULL as id
from users u
where CONCAT(f_name, ' ', l_name) like '%k%';
union all
select null, null, null, l.name, l.id
from locations l
where l.name LIKE '%k%';