在MySQL中连接多个表:“未知列”

时间:2013-05-13 21:51:31

标签: mysql sql

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

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 个答案:

答案 0 :(得分: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停止为ON   stop_times.stop_id = stops.stop_id INNER JOIN开启   stop_times.trip_id = trips.trip_id WHERE stops.stop_code = 1

SQL Fiddle Showing the Assumed Mistake

答案 1 :(得分:3)

根据您提供的内容,没有理由不这样做:

SQL Fiddle

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

<强> Results

| STOP_SEQUENCE |
|---------------|
|             1 |

答案 2 :(得分: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

答案 3 :(得分: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