2016-03-03 75 views
0

所以我有兩個查詢,我想一起使用以產生一個輸出結果給用戶。輸出向用戶描述從A到B的旅程。當我試圖將第一個查詢的結果加入到我的第二個查詢中時,我不斷收到語法錯誤。組合2個SELECT查詢

Query failed: ERROR: syntax error at or near "UNION" LINE 6: UNION^

我有一個看一個類似的問題,但提供的解決方案&討論似乎並不管用。

$name = pg_escape_string($_POST['name']); // Start destination from user input 
$name2 = pg_escape_string($_POST['name2']); // End destination from user input 

//If no results are given, the following query below will execute instead. 

if (pg_num_rows($result) == 0) { 

$query = "SELECT dt1.name as name1,dt1.time as time1,dt2.name as name2,dt2.time as time2 
From departure_times as dt1 
inner join departure_times as dt2 on dt2.tram_id = dt1.tram_id 

UNION 

SELECT dt1.name as name3,dt1.time as time3,dt2.name as name4,dt2.time as time4 
From departure_times as dt1 
inner join departure_times as dt2 on dt2.tram_id = dt1.tram_id; 

$result = pg_query($query) or die('Query failed: ' . pg_last_error()); 

} ..... 


The desired output I am looking for is the following : 

     ------------------------------------------------------------------------ 
     name1 | time1 | name2 | time2 | name3 | time3 | name4 | time4 
     ------------------------------------------------------------------------ 
+1

添加括號每個子查詢:'(選擇...極限5)聯盟(選擇...極限5)' – Abelisto

+0

像這樣:@Abelisto $查詢=(「選擇dt1.name爲NAME1,DT1。時間爲time1,dt2.name爲name2,dt2.time爲時間2 From departure_times as dt1 inner join departure_times as dt2 on dt2.tram_id = dt1.tram_id 其中dt1.name ='$ name'和dt2.name =' CitySquare」) UNION (SELECT dt1.name如NAME3,dt1.time作爲時間3,如dt2.name NAME4,dt2.time作爲時間4 從departure_times作爲DT1 內部聯接departure_times作爲DT2上dt2.tram_id = DT1 .tram_id 其中dt1.name ='CitySquare'和dt2.name ='$ name2'LIMIT 5「); – bronxdeveloper

+0

這隻顯示列名稱1,時間1,名稱2,時間2,而不是其他人。它正在提取數據,但我希望將這兩個查詢放在不同的列中@Abelisto – bronxdeveloper

回答

2

由外觀,你想創建一個輸出,列出從某個電臺到城市廣場的5個電車和從城市廣場到另一個電臺的5個電車。在這種情況下 - 你沒有在這兩個電臺之間建立任何連接(例如,準時)事情 - 你應該加入一個僞列,row_number() OVER()想到:

SELECT '$name' AS name1, w1.time1, 'City Square - arrival' AS name2, w1.time2, 
     'City Square - departure' AS name3, w2.time3, '$name2' AS name4, w2.time4 
FROM (
    SELECT dt1.time AS time1, dt2.time AS time2, row_number() OVER() AS rn 
    FROM departure_times AS dt1 
    JOIN departure_times AS dt2 USING (tram_id) 
    WHERE dt1.name = '$name' AND dt2.name = 'CitySquare' 
    LIMIT 5) w1 
JOIN (
    SELECT dt1.time AS time3, dt2.time AS time4, row_number() OVER() AS rn 
    FROM departure_times AS dt1 
    JOIN departure_times AS dt2 USING (tram_id) 
    WHERE dt1.name = 'CitySquare' AND dt2.name = '$name2' 
    LIMIT 5) w2 USING (rn); 

在每個子查詢中選擇您感興趣的五行由於沒有明顯的屬性,你CA。這兩組行上,你必須創建一個僞列,可以達到這個目的(你需要加入一些東西,否則你會得到一個CROSS JOIN導致輸出5 x 5行)。使用row_number() OVER() AS rn就是這樣做的:它創建一個別名爲rn的新列,其中包含整個行集合上的行號(OVER(),5行,因爲LIMIT子句)。您可以在兩個子查詢中執行此操作,以便您可以將它用作連接條件:USING (rn)。您不必在輸出中使用此列。

您無法控制將列出哪5個電車時間。如果你想要的話,你應該在這兩個子查詢中做一些類似WHERE dt1 > CURRENT_TIMEORDER BY dt1的東西,或者沿着那條線。

+0

您能否向我解釋您提供的解決方案,以便我能夠理解發生了什麼,只是爲了讓事情清楚 – bronxdeveloper

+0

@ A.Khan您一直試圖刪除我答案的重要部分。你不能那樣做。一旦發佈的東西掛起在SO,直到主持人或審查員另有決定。沒有人會允許你刪除這些內容,所以你不妨放棄嘗試。 – Patrick

0

Abelisto已經給了你第一部分,圍繞選擇查詢放置括號。

對於問題的第二部分,如果您想要顯示所有列,那麼您需要在兩個查詢中都具有​​所有列。因此,沿着添加null::text AS name3, null::timestamp AS time3等行(注意,我猜你的類型與類型鑄造,你可能不得不改變,根據你的查詢返回類型

+0

這兩個查詢都返回一個字符變化類型的名稱和時間,但沒有時區類型。所以我需要添加null :: text AS name3,null :: timestamp AS,time3 null :: text AS name4,null :: timestamp AS time4以便所有列顯示出來。 – bronxdeveloper