7

クエリに問題があります。

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
4

3 に答える 3

18

JOINSyntaxの下に記載されているように:

MySQL 5.0.12 での結合処理の変更

[ deletia ]

  • 以前は、コンマ演算子 ( ,) とJOIN両方の優先順位が同じだったため、結合式t1, t2 JOIN t3は として解釈されていまし((t1, t2) JOIN t3)た。JOINの優先順位が高くなったため、式は として解釈されます(t1, (t2 JOIN t3))。この変更は、句を使用するステートメントに影響しますON。その句は、結合のオペランドの列のみを参照でき、優先順位の変更により、それらのオペランドの解釈が変わるためです。

    例:

    CREATE TABLE t1 (i1 INT, j1 INT);
    CREATE TABLE t2 (i2 INT, j2 INT);
    CREATE TABLE t3 (i3 INT, j3 INT);
    t1 値 (1,1) に挿入します。
    t2 値 (1,1) に挿入します。
    t3 値 (1,1) に挿入します。
    SELECT * FROM t1, t2 JOIN t3 ON (t1.i1 = t3.i3);

    以前は、 as が暗黙的にグループ化されていたため、はSELECT正当でした。が優先されるようになったため、句のオペランドはandになります。はどちらのオペランドにも列がないため、結果はエラーになります。結合を処理できるようにするには、句のオペランドがandになるように、最初の 2 つのテーブルを括弧で明示的にグループ化します。t1,t2(t1,t2)JOINONt2t3t1.i1Unknown column 't1.i1' in 'on clause'ON(t1,t2)t3

    SELECT * FROM (t1, t2) JOIN t3 ON (t1.i1 = t3.i3);

    または、カンマ演算子の使用を避け、JOIN代わりに次を使用します。

    SELECT * FROM t1 JOIN t2 JOIN t3 ON (t1.i1 = t3.i3);

    INNER JOINこの変更は、カンマ演算子と、CROSS JOINLEFT JOIN、およびが混在するステートメントにも適用されますRIGHT JOIN。これらはすべて、カンマ演算子よりも優先されます。

于 2012-09-16T00:10:05.240 に答える
1

from 句がテーブル間で結合されていません。クエリを解析したい場合は、これを試してください:

from `users` cross join
     `interests` LEFT JOIN
     `blocked`
     on . . .

または、さらに良いことに、結合を正しく表現します。

from `users` join
     `interests` 
     on `interests`.`user_id` = `users`.`id` LEFT JOIN
     `blocked`
     on . . . 

あなたへの私のアドバイスは、FROM ステートメントで「,」を使用しないことです。これは CROSS JOIN を意味し、WHERE 句の条件を逃した場合、非常にコストのかかる操作になります。コンマは簡単に見逃されます。カンマを削除すると、2 番目のテーブルが最初のテーブルのエイリアスになります。意味が大きく異なります。また、WHERE 句に結合条件を入れないでください。これは、ON 句が行っていることです。

ただし、この場合、MySQL がエラーを生成することに驚いています。おそらく、テーブル間に明示的な結合がないためです。

于 2012-09-16T00:08:58.467 に答える
0

LEFT JOIN の時点では ID 列がわからないため (テーブル USERS が結合される前に行われます)、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`
       JOIN `interests`
         ON `interests`.`user_id` = `users`.`id`
       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`.`interest` = 'Food'
       AND `interests`.`active` = 1
       AND `users`.`active` = 1
ORDER  BY `users`.`last_login` DESC
LIMIT  0, 25  
于 2012-09-16T00:19:04.597 に答える