我的查询有问题。
MySQL查询:
SELECT DISTINCT(`users`.`username`), `users`.`full_name`, `users`.`profile_picture_url`, `users`.`followed_by_count`, `users`.`follows_count`, `users`.`bio`, `users`.`id` FROM `users`,`interests` LEFT JOIN `blocked` ON `blocked`.`receiver_id` = `users`.`id` AND `blocked`.`actor_id` = 100 AND `blocked`.`blocked_reason` = 'Blocked' WHERE `blocked`.`receiver_id` IS NULL AND `users`.`instagram_active` = 1 AND `users`.`banned` = 0 AND `interests`.`user_id` = `users`.`id` AND `interests`.`interest` = 'Food' AND `interests`.`active` = 1 AND `users`.`active` = 1 ORDER BY `users`.`last_login` DESC LIMIT 0, 25
我得到的错误是这样的:
1054-‘on子句’中的未知列’users.id’
选择时如何将其作为未知列?
我很困扰…
使用者:
CREATE TABLE `users` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `instagram_id` int(11) NOT NULL, `username` varchar(100) COLLATE utf8_unicode_ci NOT NULL, `bio` text COLLATE utf8_unicode_ci, `website` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `profile_picture_url` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `full_name` varchar(200) COLLATE utf8_unicode_ci NOT NULL, `media_count` int(11) unsigned NOT NULL, `followed_by_count` int(11) unsigned NOT NULL, `follows_count` int(11) unsigned NOT NULL, `last_updated` datetime NOT NULL, `last_updated_instagram` datetime NOT NULL, `instagram_active` tinyint(1) DEFAULT NULL, `last_login` datetime NOT NULL, `inserted_on` datetime NOT NULL, `banned` tinyint(1) NOT NULL DEFAULT '0', `banned_reason` text COLLATE utf8_unicode_ci, `oauth_token` varchar(150) COLLATE utf8_unicode_ci NOT NULL, `user_level` tinyint(4) NOT NULL, `shown_to_others` tinyint(1) NOT NULL DEFAULT '1', `credits_offered` tinyint(1) unsigned NOT NULL DEFAULT '2', `active` tinyint(1) NOT NULL DEFAULT '1', `email` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `registered_ip` varchar(17) COLLATE utf8_unicode_ci DEFAULT NULL, `credits` int(11) NOT NULL, `email_notifications` tinyint(1) NOT NULL DEFAULT '1', `todays_followers` int(11) NOT NULL DEFAULT '0', `todays_followers_hour` int(11) NOT NULL, `total_followers` int(11) NOT NULL, `credits_yesterday` int(11) NOT NULL, `email_is_verified` tinyint(1) NOT NULL DEFAULT '0', `email_announcements` tinyint(1) NOT NULL DEFAULT '1', `email_credits` tinyint(1) NOT NULL DEFAULT '1', `verification_code` varchar(25) COLLATE utf8_unicode_ci DEFAULT NULL, `country_id` bigint(20) unsigned DEFAULT NULL, `browser_info_id` bigint(20) unsigned DEFAULT NULL, `featured_user` tinyint(1) NOT NULL DEFAULT '0', `emailed_credits` tinyint(1) NOT NULL DEFAULT '0', UNIQUE KEY `id` (`id`), UNIQUE KEY `instagram_id` (`instagram_id`), KEY `country_id` (`country_id`), KEY `browser_info_id` (`browser_info_id`), KEY `username` (`username`,`instagram_active`,`banned`), CONSTRAINT `users_ibfk_1` FOREIGN KEY (`country_id`) REFERENCES `countries` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, CONSTRAINT `users_ibfk_2` FOREIGN KEY (`browser_info_id`) REFERENCES `browser_info` (`id`) ON DELETE SET NULL ON UPDATE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=1279 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
兴趣:
CREATE TABLE `interests` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `user_id` bigint(20) unsigned NOT NULL, `interest` varchar(25) COLLATE utf8_unicode_ci NOT NULL, `inserted_dt` datetime NOT NULL, `active` tinyint(1) NOT NULL DEFAULT '1', UNIQUE KEY `id` (`id`), KEY `user_id` (`user_id`), KEY `interest` (`interest`), CONSTRAINT `interests_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=4161 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
已封锁:
CREATE TABLE `blocked` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `actor_id` bigint(20) unsigned NOT NULL, `receiver_id` bigint(20) unsigned DEFAULT NULL, `blocked_reason` enum('Skipped','Blocked') COLLATE utf8_unicode_ci NOT NULL, `inserted_dt` datetime NOT NULL, `active` tinyint(1) NOT NULL DEFAULT '1', `browser_info_id` bigint(20) unsigned DEFAULT NULL, UNIQUE KEY `id` (`id`), KEY `actor_id` (`actor_id`,`receiver_id`), KEY `receiver_id` (`receiver_id`), KEY `browser_info_id` (`browser_info_id`), CONSTRAINT `blocked_ibfk_1` FOREIGN KEY (`actor_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `blocked_ibfk_2` FOREIGN KEY (`receiver_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `blocked_ibfk_3` FOREIGN KEY (`browser_info_id`) REFERENCES `browser_info` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=5700 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
如JOIN语法所示:
JOIN
在MySQL 5.0.12中加入处理更改 [ deletia ] 以前,逗号运算符(,)和JOIN都具有相同的优先级,因此join表达式t1, t2 JOIN t3被解释为((t1, t2) JOIN t3)。现在JOIN具有更高的优先级,因此该表达式被解释为(t1, (t2 JOIN t3))。此更改会影响使用ON子句的语句,因为该子句只能引用联接操作数中的列,并且优先级的更改会更改对这些操作数的解释。 例子: > 创建表t1(i1 INT,j1 INT); 创建表t2(i2 INT,j2 INT); 创建表t3(i3 INT,j3 INT); 插入t1值(1,1); 插入t2值(1,1); 插入t3值(1,1); 选择* FROM t1,t2 JOIN t3 ON(t1.i1 = t3.i3); 以前,SELECT由于t1,t2as的隐式分组,所以合法(t1,t2)。现在JOIN优先,所以ON子句的操作数是t2和t3。因为t1.i1这两个操作数都不是列,所以结果是Unknown column 't1.i1' in 'on clause'错误。要允许处理连接,请使用括号将前两个表显式分组,以便该ON子句的操作数为(t1,t2)和t3: > 选择* FROM(t1,t2)JOIN t3 ON(t1.i1 = t3.i3); 另外,请避免使用逗号运算符,而应使用JOIN: > 选择* FROM t1 JOIN t2 JOIN t3 ON(t1.i1 = t3.i3); 这种变化也适用于与混合逗号操作语句INNER JOIN,CROSS JOIN,LEFT JOIN,并且RIGHT JOIN,所有这些现在已经比逗号运算符优先级越高。
[ deletia ]
,
t1, t2 JOIN t3
((t1, t2) JOIN t3)
(t1, (t2 JOIN t3))
ON
例子:
> 创建表t1(i1 INT,j1 INT); 创建表t2(i2 INT,j2 INT); 创建表t3(i3 INT,j3 INT); 插入t1值(1,1); 插入t2值(1,1); 插入t3值(1,1); 选择* FROM t1,t2 JOIN t3 ON(t1.i1 = t3.i3);
以前,SELECT由于t1,t2as的隐式分组,所以合法(t1,t2)。现在JOIN优先,所以ON子句的操作数是t2和t3。因为t1.i1这两个操作数都不是列,所以结果是Unknown column 't1.i1' in 'on clause'错误。要允许处理连接,请使用括号将前两个表显式分组,以便该ON子句的操作数为(t1,t2)和t3:
SELECT
t1,t2
(t1,t2)
t2
t3
t1.i1
Unknown column 't1.i1' in 'on clause'
> 选择* FROM(t1,t2)JOIN t3 ON(t1.i1 = t3.i3);
另外,请避免使用逗号运算符,而应使用JOIN:
> 选择* FROM t1 JOIN t2 JOIN t3 ON(t1.i1 = t3.i3);
这种变化也适用于与混合逗号操作语句INNER JOIN,CROSS JOIN,LEFT JOIN,并且RIGHT JOIN,所有这些现在已经比逗号运算符优先级越高。
INNER JOIN
CROSS JOIN
LEFT JOIN
RIGHT JOIN