从两个不同的表中选择两列,每个表具有不同的列名

时间:2012-03-09 00:37:25

标签: php sql postgresql

我无法搞清楚这个查询。我正在使用PHP和postgresql 9.1。我希望能够根据其他字段中的条件从行中选择字段。

A包含列:

vid, title, description, col4, col5, col6, col7

B包含列:

pid, title, description, colx, coly

我想从两个表中搜索titledescription,如果找到匹配项,请返回找到的行的vidpid。< / p>

到目前为止我尝试过:

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语句的列名 此外,它只返回一个或另一个。如果在两者中找到该值,我希望两个值都包含两个值。

4 个答案:

答案 0 :(得分:1)

你可以这样写:

SELECT 'vid' AS key, vid,  NULL AS pid FROM tableA WHERE title LIKE ...
UNION
SELECT 'pid',        NULL, pid         FROM tableB WHERE title LIKE ...

答案 1 :(得分:1)

单个查询和UNION无法满足您的要求。根据w3schools,当你使用UNION时,列被强制匹配第一个select语句。

http://www.w3schools.com/sql/sql_union.asp

答案 2 :(得分:1)

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

答案 3 :(得分:0)

尝试: -

   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 ...