Php 组合2个SELECT查询
因此,我有两个查询,我想一起使用它们向用户生成一个输出结果。输出向用户描述了从A到B的过程。当我试图将第一个查询的结果加入到第二个查询时,我不断遇到语法错误Php 组合2个SELECT查询,php,sql,database,postgresql,Php,Sql,Database,Postgresql,因此,我有两个查询,我想一起使用它们向用户生成一个输出结果。输出向用户描述了从A到B的过程。当我试图将第一个查询的结果加入到第二个查询时,我不断遇到语法错误 Query failed: ERROR: syntax error at or near "UNION" LINE 6: UNION ^ 我看过一个类似的问题,但提供的解决方案和讨论似乎不起作用 $name = pg_escape_string($_POST['name']); // Start destination from user
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
------------------------------------------------------------------------
Abelisto已经给出了第一部分,在select查询周围加上括号
对于问题的第二部分,如果希望显示所有列,则需要在两个查询中都显示所有列。因此,添加
null::text作为name3,null::timestamp作为time3
等等(注意,我在猜测类型转换的类型,您可能需要根据查询返回的类型进行更改。Abelisto已经为您提供了第一部分,在select查询周围加上括号
对于问题的第二部分,如果希望显示所有列,则需要在两个查询中都显示所有列。(注意,我用类型转换猜测您的类型,您可能需要根据查询返回的类型进行更改。从外观上看,您希望创建一个输出,其中列出从某个车站到城市广场的5辆电车和从城市广场到其他车站的5辆电车。在这种情况下,您不需要进行任何转换。)这两件事之间的连接(例如,准时)-您应该在一个伪列上连接,
row\u 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);
在每个子查询中,您选择感兴趣的五行。由于没有明显的属性可以连接这两组行,因此您必须创建一些可用于此目的的伪列(您需要连接某些内容,否则将得到一个交叉连接,从而在输出中产生5 x 5行).Using的作用是:它创建了一个别名为rn
的新列,其中包含整个行集上的行号(over()
,由于LIMIT
子句,有5行)。您可以在两个子查询中都这样做,以便将其用作联接条件:Using(rn)
。您不必在输出中使用此列
您无法控制将列出哪5辆电车的时间。如果您想这样做,您应该在两个子查询中执行类似于
WHERE dt1>CURRENT_TIME
和ORDER BY dt1
的操作,或者沿着这条线执行操作。从外观上看,您希望创建一个输出,列出从某个车站到城市广场的5辆电车,并从城市广场到其他车站的5辆有轨电车。在这种情况下-你没有在这两件事之间建立任何联系(例如,准时)-你应该在一个伪列上连接,row_number()(
):
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);
在每个子查询中,您选择感兴趣的五行。由于没有明显的属性可以连接这两组行,因此您必须创建一些可用于此目的的伪列(您需要连接某些内容,否则将得到一个交叉连接,从而在输出中产生5 x 5行).Using的作用是:它创建了一个别名为rn
的新列,其中包含整个行集上的行号(over()
,由于LIMIT
子句,有5行)。您可以在两个子查询中都这样做,以便将其用作联接条件:Using(rn)
。您不必在输出中使用此列
您无法控制将列出的5个电车时间。如果您想要这样做,您应该在两个子查询中执行类似于
WHERE dt1>CURRENT_TIME
和ORDER BY dt1
的操作,或者沿着该行执行。在每个子查询周围添加括号:(选择…限制5)union(选择…限制5)
类似于:@Abelisto$query=(“选择dt1.name作为name1,dt1.time作为time1,dt2.name作为name2,dt2.time作为time2从出发点出发\u倍作为dt1内部连接出发\u倍作为dt2.tram上的dt2.tram\u id=dt1.tram\u id,其中dt1.name='$name'和dt2.name='CitySquare')联合(在dt2.tram_id=dt1.tram_id=dt1.tram_id,其中dt1.name='CitySquare'和dt2.name='name2'LIMIT 5上选择dt1.name作为name3,dt1.time作为time3,dt2.name作为name4,dt2.time作为time4从出发时间作为dt1内部连接出发时间作为dt2);这只显示列name1、time1、name2、time2,而不显示其余的列。它正在获取数据,但我希望两个查询位于单独的列@AbelistoUNION
垂直连接查询。若要水平连接,请改为使用join
。不要以这样的方式编辑您的问题,使其变得无用!在ea周围添加括号ch子查询:(select…limit 5)union(select…limit 5)
类似于:@Abelisto$query=(“select dt1.name作为name1,dt1.time作为time1,dt2.name作为name2,dt2.time作为time2从出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点出发点(在dt2.tram_id=dt1.tram_id=dt1.tram_id,其中dt1.name='CitySquare'和dt2.name='name2'LIMIT 5上选择dt1.name作为name3,dt1.time作为time3,dt2.name作为name4,dt2.time作为time4从出发时间作为dt1内部连接出发时间作为dt2);这只显示列name1、time1、name2、time2,而不显示其余的列。它正在获取数据,但我希望两个查询位于单独的列@AbelistoUNION
垂直连接查询。若要水平连接,请改为使用join
。不要以使问题变得无用的方式编辑问题!两个查询都返回名称的字符类型不同,时间的时区类型不同。因此,我需要为所有colu添加null::text作为name3,null::timestamp作为,time3 null::text作为name4,null::timestamp作为time4