2012-03-09 117 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 ... 
相關問題