我有 2 个查询,我想将它们一起使用以向用户生成一个输出结果。输出向用户描述了从 A 到 B 的旅程。当我尝试将两个查询与UNION以下内容结合时,我不断收到语法错误:
Run Code Online (Sandbox Code Playgroud)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
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)
主要的解决方案是添加括号:
( -- 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条款具有以下一般形式:Run Code Online (Sandbox Code Playgroud)select_statement UNION [ ALL | DISTINCT ] select_statement
select_statement是SELECT不带ORDER BY,LIMIT,FOR NO KEY UPDATE,FOR UPDATE,FOR SHARE, orFOR KEY SHARE子句的任何语句。(如果子表达式被括号括起来ORDER BY,LIMIT则可以附加到子表达式上。如果没有括号,这些子句将应用于 的结果,而UNION不是其右侧的输入表达式。)
其他注意事项:
我切换到UNION ALL- 假设您实际上不想尝试折叠重复的行。
结果列的名称由查询的第SELECT一个确定UNION。SELECT忽略以下所有语句中的名称(或别名)。
您可能想要添加ORDER BY到每个SELECT. LIMITwithoutpriorORDER BY返回一个可以随每次执行而改变的任意选择 - 在由表(或索引)中行的物理顺序确定的简单查询中,可以随时更改。
| 归档时间: |
|
| 查看次数: |
9239 次 |
| 最近记录: |