我很难弄清楚这个查询。我使用的是PHP和postgresql9.1。我希望能够根据另一个字段中的标准从行中选择字段
表A
有列:
vid, title, description, col4, col5, col6, col7
表B
有列:
pid, title, description, colx, coly
我想从两个表中搜索title
和description
,如果找到匹配项,则返回它所在行的vid
或pid
。
到目前为止我尝试过的:
SELECT vid FROM tableA WHERE title LIKE %somevalue%
UNION
SELECT pid FROM tableB WHERE title LIKE %somevalue%
问题是,当我这样做时,它找到了tableB
的匹配项,它返回了正确的值,但分配给了数组中的vid
列。php数组显示
Array ( [0] => Array ( [vid] => 100007 ) )
什么时候应该是
Array ( [0] => Array ( [pid] => 100007 ) )
它没有给我表的正确列名。它只提供了第一个select语句的列名
此外,它只返回一个或另一个。如果在两者中都找到了值,我希望两个值都包含两列。
SELECT
a.vid,
b.pid
FROM (
SELECT vid, ROW_NUMBER() OVER (ORDER BY vid) AS rn
FROM tableA
WHERE title LIKE '%somevalue%'
) a
FULL JOIN (
SELECT pid, ROW_NUMBER() OVER (ORDER BY pid) AS rn
FROM tableB
WHERE title LIKE '%somevalue%'
) b
ON a.rn = b.rn
您可以编写以下内容:
SELECT 'vid' AS key, vid, NULL AS pid FROM tableA WHERE title LIKE ...
UNION
SELECT 'pid', NULL, pid FROM tableB WHERE title LIKE ...
您所要求的内容不可能通过单个查询和UNION来实现。根据w3schools的说法,当使用UNION时,列必须与第一个select语句匹配。
http://www.w3schools.com/sql/sql_union.asp
尝试:-
SELECT vid as 'id', 'isVid' as idType FROM tableA WHERE title LIKE ...
UNION
SELECT pid as 'id', 'isPid' as idType FROM tableB WHERE title LIKE ...