2012-03-09 156 views
0

我无法确定此查询。我使用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语句的列名。
此外,它只返回一个或另一个。如果在两个列中均找到该值,我希望这两个列都具有这两个值。

+0

肯定有人知道如何选择语句结合起来,得到正确的结果。由于联合不正确,哪些子查询会起作用呢? – 2012-03-09 01:51:55

回答

0
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 
+0

这与我正在寻找的东西非常接近。不太清楚它是如何工作的,但它是有效的。虽然我宁愿不把它的空栏回来,它仍然是最好的答案,并按我的想法工作。我将使用PHP来处理我猜想的空键/值。 – 2012-03-09 03:50:36

+0

查询的结果应该包含一组固定的列。如果您希望它是动态的,则查询本身应该动态构建。不知道PostgreSQL是否允许你构建和执行动态查询,但我毫不怀疑最终查询比这里提供的任何解决方案都要复杂。所以是的,在客户端代码中处理空值是一个好主意,这就是我最可能选择做的事情。 – 2012-03-09 07:33:27

1

您可以编写类似:

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

无法正常工作,因为我需要它。与Martin的 – 2012-03-09 00:51:24

+0

@Pjack相同:在这种情况下,听起来你并不想要一个'UNION'! – ruakh 2012-03-09 01:01:44

+0

好吧然后我需要检索两个列名称,它找到的值? – 2012-03-09 01:07:54

1

是你所要求的不可能与一个单一的查询和UNION。根据w3schools的说法,当您使用UNION时,这些列将被迫匹配第一条select语句。

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

+0

没有用:/它所做的只是拉列名Array([0] => Array([vid] => 100007 [pid] =>)),但它甚至不应该有vid在那里应该是Array([0 ] => Array([pid] => 100007)) – 2012-03-09 00:49:47

+0

我相信SQL会强制执行联合时所有结果具有相同的列。为什么不只是运行两个查询? – Martin 2012-03-09 00:52:58

+0

好吧然后,我需要检索两个列名称,它发现的价值?它需要在一个声明中,而不是在子选择中。 – 2012-03-09 01:08:16

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