2

JOIN在 MySQL 中遇到了一个简单的错误。我错过了一些明显的东西吗?

SELECT stop_times.stop_sequence
FROM stop_times
INNER JOIN stops ON stop_times.stop_id = stops.stop_id
INNER JOIN trips ON stop_times.trip_id = trips.trip_id
WHERE stops.stop_code = :stopCode;

哪里:stopCode是通过 PDO 绑定的参数。

我得到的错误是:SQLSTATE[42S22]: Column not found: 1054 Unknown column 'stop_times.trip_id' in 'on clause''

这三个表的数据库架构是:

stop_times
----------
trip_id VARCHAR(23) NOT NULL -- PK
arrival_time TIME NOT NULL
departure_time TIME NOT NULL
stop_id INT(10) UNSIGNED NOT NULL -- PK
stop_sequence INT(10) UNSIGNED NOT NULL -- PK


stops
-----
stop_id INT(10) UNSIGNED NOT NULL -- PK
stop_code INT(5) UNSIGNED NULL
stop_name VARCHAR(53) NOT NULL
stop_lat DECIMAL(8, 6) NOT NULL
stop_lon DECIMAL(9, 6) NOT NULL
stop_url VARCHAR(66) NULL

trips
-----
route_id INT(8) UNSIGNED NOT NULL
service_id VARCHAR(6) NOT NULL
trip_id VARCHAR(23) NOT NULL -- PK
trip_headsign VARCHAR(255) NOT NULL

我也尝试过使用别名,但没有奏效。在 Microsoft Access 中运行查询有效,但生成的 SQL 在 JOIN 语句周围有括号。

为什么我的查询不起作用?

4

4 回答 4

12

您是否在实际查询中使用反引号 (` `) 来转义表/列名称,但将它们从您的问题中剔除?我猜是的,因为它们可能会给你一些格式问题,因为 Stack Overflow 使用它们来转义代码块......

我的猜测是你打算写:

INNER JOIN `trips` ON `stop_times`.`trip_id` = `trips`.`trip_id`

但相反,你写道:

INNER JOIN `trips` ON `stop_times.trip_id` = `trips`.`trip_id`

由于您缺少一对反引号,因此将其视为单个列名,从而为您提供以下错误:

'on 子句'中的未知列'stop_times.trip_id':SELECT stop_times.stop_sequence FROM stop_times INNER JOIN stop ON stop_times.stop_id = stops.stop_id INNER JOIN trips ON stop_times.trip_id= trips.trip_id WHERE stops.stop_code = 1

SQL Fiddle 显示假定的错误

于 2013-08-30T20:50:12.370 回答
3

根据您提供的内容,这没有理由不起作用:

SQL小提琴

MySQL 5.5.32 架构设置

create table stop_times (
trip_id VARCHAR(23) NOT NULL,
arrival_time TIME NOT NULL,
departure_time TIME NOT NULL,
stop_id INT(10) UNSIGNED NOT NULL,
stop_sequence INT(10) UNSIGNED NOT NULL
);


create table stops (
stop_id INT(10) UNSIGNED NOT NULL,
stop_code INT(5) UNSIGNED NULL,
stop_name VARCHAR(53) NOT NULL,
stop_lat DECIMAL(8, 6) NOT NULL,
stop_lon DECIMAL(9, 6) NOT NULL,
stop_url VARCHAR(66) NULL);

create table trips (
route_id INT(8) UNSIGNED NOT NULL,
service_id VARCHAR(6) NOT NULL,
trip_id VARCHAR(23) NOT NULL,
trip_headsign VARCHAR(255) NOT NULL);   

INSERT INTO stop_times
    (trip_id, arrival_time, departure_time, stop_id, stop_sequence)
VALUES
    ('TRIP_ID', '09:00', '09:30', 1, 1)
;

INSERT INTO stops
    (stop_id, stop_code, stop_name, stop_lat, stop_lon, stop_url)
VALUES
    (1, 1, 'NAME', 1.3, 2.4, 'www.url.com')
;

INSERT INTO trips
    (route_id, service_id, trip_id, trip_headsign)
VALUES
    (1, 'SRV_ID', 'TRIP_ID', 'HEADSIGN')
;

查询 1

SELECT stop_times.stop_sequence
FROM stop_times
INNER JOIN stops ON stop_times.stop_id = stops.stop_id
INNER JOIN trips ON stop_times.trip_id = trips.trip_id
WHERE stops.stop_code = 1

结果

| STOP_SEQUENCE |
|---------------|
|             1 |
于 2013-08-30T19:27:29.250 回答
0

正如 Fabien TheSolution 指出的那样,在您提出问题时,您的查询似乎没有任何问题。当您混合显式和隐式连接(ANSI-92 与 ANSI-89)时,您会看到类似的错误。

您是否可以简化发布查询?如果您的查询看起来像这样具有一个显式连接和一个隐式或自然连接,那么您的错误可能是有意义的:

SELECT stop_times.stop_sequence
FROM stop_times, stops
INNER JOIN trips ON stop_times.trip_id = trips.trip_id
WHERE stop_times.stop_id = stops.stop_id AND stops.stop_code = :stopCode 

您的查询也适用于所有自然连接:

SELECT stop_times.stop_sequence
FROM stop_times, stops, trips
WHERE stop_times.stop_id = stops.stop_id 
  AND stop_times.trip_id = trips.trip_id
  AND stops.stop_code = :stopCode
于 2013-08-30T20:19:04.493 回答
0

在您的代码中,您使用别名而不给它们一个名称,这就是为什么您收到错误尝试在查询中使用以下内容。

  SELECT a.stop_sequence
  FROM (
    SELECT st.stop_sequence, st.trip_id, s.stop_code
    FROM stop_times st
    INNER JOIN stops s ON st.stop_id = s.stop_id
       )a
INNER JOIN trips ON a.trip_id = trips.trip_id
WHERE a.stop_code =1
于 2013-09-05T05:43:20.523 回答