【问题标题】:Select two columns from two different tables each with different column names从两个不同的表中选择两列,每个表都有不同的列名
【发布时间】:2012-03-09 00:37:25
【问题描述】:

我无法弄清楚这个查询。我正在使用 PHP 和 postgresql 9.1。我希望能够根据另一个字段中的条件从行中选择字段,就像这样。

A 有列:

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

B 有列:

pid, title, description, colx, coly

我想从两个表中搜索titledescription,如果找到匹配项,则返回找到它的行的vidpid

到目前为止我已经尝试过:

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 语句以获得正确的结果。由于 union 不正确,哪些子查询可以代替?

标签: php sql postgresql


【解决方案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

【讨论】:

  • 这与我正在寻找的非常接近。不太清楚它是如何工作的,但它确实有效。尽管如果它为空,我宁愿它不带回该列,但它仍然是最好的答案,并且可以按照我的意愿工作。我将使用 PHP 来处理我猜的空键/值。
  • 查询结果应该包含一组固定的列。如果您希望它是动态的,则应动态构建查询本身。不确定 PostgreSQL 是否允许您构建和执行动态查询,但我毫不怀疑最终查询会比此处提供的任何解决方案都复杂。所以是的,在客户端代码中处理空值是个好主意,这也是我最有可能选择做的事情。
【解决方案2】:

你可以这样写:

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

【讨论】:

  • 无法正常工作,因为我需要它。和马丁的一样
  • @Pjack:在那种情况下,听起来你实际上并不想要UNION
  • 好的,那么我需要什么来检索它在其中找到值的两个列名?
  • @Pjack:我的回答提供了这一点。如果您对此不满意,那么我认为您不走运。
  • 不,不完全是。它将返回其他列,但方式不正确。如果它在两列中都找到两个结果,我需要它说 pid->100007 和 vid->100342。你的列名是空的,不适用于我的 php 数组函数。所以它真的不提供。
【解决方案3】:

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

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

【讨论】:

  • 没什么用的 :/ 它所做的只是拉取列名 Array ( [0] => Array ( [vid] => 100007 [pid] => ) ) 但它甚至不应该有 vid应该有 Array ( [0] => Array ( [pid] => 100007 ) )
  • 我相信当你执行联合时,SQL 会强制所有结果具有相同的列。为什么不只运行两个查询?
  • 好的,那么我需要什么来检索它在其中找到值的两个列名?它需要在一个语句中,并且不适合子选择。
  • 引用 W3S(参见 w3fools.com)作为任何事情的权威只会给您带来麻烦,PostgreSQL 手册要好得多,而且它也很准确(与 W3S 不同)。
【解决方案4】:

试试:-

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

【讨论】:

    猜你喜欢
    • 2016-05-14
    • 2017-11-11
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    相关资源
    最近更新 更多