2016-03-03 97 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