结合 2 个 SELECT 查询并在 PostgreSQL 中打印结果

0 postgresql php union

我有 2 个查询,我想将它们一起使用以向用户生成一个输出结果。输出向用户描述了从 A 到 B 的旅程。当我尝试将两个查询与UNION以下内容结合时,我不断收到语法错误:

Query failed: ERROR: syntax error at or near "UNION" LINE 6: UNION ^
Run Code Online (Sandbox Code Playgroud)

我看过一个类似的问题,但提供的解决方案和讨论似乎不起作用。

$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
where dt1.name = '$name' and dt2.name = 'CitySquare' LIMIT 5 

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
where dt1.name = 'CitySquare' and dt2.name = '$name2' LIMIT 5";
$result = pg_query($query) or die('Query failed: ' . pg_last_error());
} ...
Run Code Online (Sandbox Code Playgroud)

所需的输出:

------------------------------------------------------------------------
    name1 | time1  | name2  | time2 | name3 |  time3    | name4  | time4
------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 6

主要的解决方案是添加括号:

(  -- parentheses required!
SELECT dt1.name AS name1, dt1.time AS time1
     , dt2.name AS name2, dt2.time AS time2
FROM   departure_times dt1
JOIN   departure_times dt2 USING (tram_id)
WHERE  dt1.name = '$name'
AND    dt2.name = 'CitySquare'
-- no ORDER BY?
LIMIT  5 
)
UNION ALL  -- see below
(
SELECT dt1.name, dt1.time, dt2.name, dt2.time  -- see below
FROM   departure_times dt1
JOIN   departure_times dt2 USING (tram_id)
WHERE  dt1.name = 'CitySquare'
AND    dt2.name = '$name2'
-- no ORDER BY?
LIMIT  5
);
Run Code Online (Sandbox Code Playgroud)

没有额外的括号LIMIT只允许在查询结束时出现一次,并应用于UNION. 需要LIMIT在每个SELECT括号中附加。

手册:

UNION条款具有以下一般形式:

select_statement UNION [ ALL | DISTINCT ] select_statement
Run Code Online (Sandbox Code Playgroud)

select_statementSELECT不带ORDER BY, LIMIT, FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE, orFOR KEY SHARE子句的任何语句。(如果子表达式被括号括起来ORDER BYLIMIT则可以附加到子表达式上。如果没有括号,这些子句将应用于 的结果,而UNION不是其右侧的输入表达式。)

其他注意事项:

  • 我切换到UNION ALL- 假设您实际上不想尝试折叠重复的行。

  • 结果列的名称由查询的第SELECT一个确定UNIONSELECT忽略以下所有语句中的名称(或别名)。

  • 您可能想要添加ORDER BY到每个SELECT. LIMITwithoutpriorORDER BY返回一个可以随每次执行而改变的任意选择 - 在由表(或索引)中行的物理顺序确定的简单查询中,可以随时更改。