Mysql 如果存在子查询,则未知联接列

Mysql 如果存在子查询,则未知联接列,mysql,Mysql,我有两个表:查询和天数,创建如下: CREATE TEMPORARY TABLE `days` ( `id` int(11) NOT NULL AUTO_INCREMENT, `day` date DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8 CREATE TABLE `queries` ( `id` int(11) unsigned NOT NUL

我有两个表:
查询
天数
,创建如下:

CREATE TEMPORARY TABLE `days` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `day` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8

CREATE TABLE `queries` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `from_lat` decimal(10,6) NOT NULL,
  `from_lon` decimal(10,6) NOT NULL,
  `to_lat` decimal(10,6) NOT NULL,
  `to_lon` decimal(10,6) NOT NULL,
  `city` varchar(64) NOT NULL DEFAULT '',
  `duration` float NOT NULL COMMENT 'query execution duration',
  `query_datetime` datetime NOT NULL,
  `execution_datetime` datetime NOT NULL,
  `result` varchar(50) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `from_lat` (`from_lat`),
  KEY `from_lon` (`from_lon`),
  KEY `to_lat` (`to_lat`),
  KEY `to_lon` (`to_lon`),
  KEY `execution_datetime` (`execution_datetime`),
  KEY `city` (`city`),
  KEY `result` (`result`),
  KEY `execution_datetime_2` (`execution_datetime`,`city`)
) ENGINE=InnoDB AUTO_INCREMENT=27338 DEFAULT CHARSET=utf8
以下是
天的内容

+----+------------+
| id | day        |
+----+------------+
|  1 | 2014-12-21 |
|  2 | 2014-12-22 |
|  3 | 2014-12-23 |
|  4 | 2014-12-24 |
|  5 | 2014-12-25 |
|  6 | 2014-12-26 |
|  7 | 2014-12-27 |
|  8 | 2014-12-28 |
|  9 | 2014-12-29 |
| 10 | 2014-12-30 |
| 11 | 2014-12-31 |
| 12 | 2015-01-01 |
| 13 | 2015-01-02 |
| 14 | 2015-01-03 |
| 15 | 2015-01-04 |
| 16 | 2015-01-05 |
| 17 | 2015-01-06 |
| 18 | 2015-01-07 |
| 19 | 2015-01-08 |
| 20 | 2015-01-09 |
| 21 | 2015-01-10 |
| 22 | 2015-01-11 |
| 23 | 2015-01-12 |
| 24 | 2015-01-13 |
| 25 | 2015-01-14 |
| 26 | 2015-01-15 |
| 27 | 2015-01-16 |
| 28 | 2015-01-17 |
| 29 | 2015-01-18 |
| 30 | 2015-01-19 |
+----+------------+
现在,如果我从连接到
days
表的
querys
表中选择数据,这就是我得到的数据(截断为10行)


现在,如果我加入一个简单的子查询:

select city from queries group by city
然后出现了一个错误:

mysql> select d.day, q.id
    -> from days d,
    -> (select city from queries group by city) c
    -> left join queries q on date(q.execution_datetime) = d.day
    -> limit 10;
ERROR 1054 (42S22): Unknown column 'd.day' in 'on clause'
如果我加入此子查询,它将起作用:

mysql> select d.day, c.city
    -> from days d
    -> left join (select city from queries group by city) c on 1
    -> left join queries q on date(q.execution_datetime) = d.day and q.city = c.city
    -> limit 10;
+------------+----------+
| day        | city     |
+------------+----------+
| 2014-12-21 | adelaide |
| 2014-12-21 | adelaide |
| 2014-12-21 | adelaide |
| 2014-12-21 | adelaide |
| 2014-12-21 | adelaide |
| 2014-12-21 | adelaide |
| 2014-12-21 | adelaide |
| 2014-12-21 | adelaide |
| 2014-12-21 | adelaide |
| 2014-12-21 | adelaide |
+------------+----------+
10 rows in set (0.00 sec)

为什么会这样?

您的问题是将逗号语法与显式连接语法混合在一起。查询无法确定别名
d
的来源,因为它位于逗号之前,而
on
子句位于
join
子句之后

另一方面,当您在上一个示例中使用显式联接语法时,别名
d
可以从一个联接语句中正确地确定为属于表
days

政府这样说:

但是,逗号运算符的优先级低于内部联接、交叉联接、左联接等。当存在连接条件时,若将逗号连接和其他连接类型混合使用,则可能会发生“on子句”中形式未知的列“col_name”的错误


现在,如果我加入一个简单的子查询:“-你想用这个来完成什么?filter
queries.city
这样,为了Brevity的缘故,这里的测试中没有提到它。你能添加预期的输出吗?我已经添加了另一个显示更多信息的查询,非常感谢。”。我不明白为什么mysql不能确定
d
来自哪里?这是一个相当简单的查询。有这方面的文件吗?(感谢您对答案的编辑;这里是对我的评论的编辑:p)
mysql> select d.day, c.city
    -> from days d
    -> left join (select city from queries group by city) c on 1
    -> left join queries q on date(q.execution_datetime) = d.day and q.city = c.city
    -> limit 10;
+------------+----------+
| day        | city     |
+------------+----------+
| 2014-12-21 | adelaide |
| 2014-12-21 | adelaide |
| 2014-12-21 | adelaide |
| 2014-12-21 | adelaide |
| 2014-12-21 | adelaide |
| 2014-12-21 | adelaide |
| 2014-12-21 | adelaide |
| 2014-12-21 | adelaide |
| 2014-12-21 | adelaide |
| 2014-12-21 | adelaide |
+------------+----------+
10 rows in set (0.00 sec)