我的网站上具有搜索功能,您可以在其中搜索用户和位置。我正在尝试使其在一个查询中获得所有结果,但它会在一行中返回结果。
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 |
*-------*------*
答案 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%';