mysql 左连接和内连接 3 个表
mysql left join and inner join 3 tables
我有 3 个表:oc_artists、oc_songs、oc_songs_tags
我可以 select 2 个表使用此代码:
SELECT * FROM `oc_songs` LEFT JOIN oc_songs_tags ON oc_songs.song_id=oc_songs_tags.song_id
WHERE oc_songs_tags.song_tag IS NULL
现在我需要 select 来自 oc_artists 的数据...我试过这个问题的答案:
MySQL LEFT JOIN 3 tables
这是我的代码:
SELECT * FROM oc_songs
LEFT JOIN oc_artists
INNER JOIN oc_songs_tags
ON oc_songs.song_artist_id = oc_artists.artist_id
ON oc_songs_tags.song_id = oc_songs.song_id
但是我收到这个错误
8 errors were found during analysis.
Unrecognized keyword. (near "ON" at position 131)
Unexpected token. (near "oc_songs_tags" at position 134)
Unexpected token. (near "." at position 147)
Unexpected token. (near "song_id" at position 148)
Unexpected token. (near "=" at position 156)
Unexpected token. (near "oc_songs" at position 158)
Unexpected token. (near "." at position 166)
Unexpected token. (near "song_id" at position 167)
ON 子句位置错误
SELECT * FROM oc_songs
LEFT JOIN oc_artists ON oc_songs.song_artist_id = oc_artists.artist_id
INNER JOIN oc_songs_tags ON oc_songs_tags.song_id = oc_songs.song_id
你的语法有误。加入语法是:
[JOIN TYPE] JOIN [TABLE B] ON [TABLE A].[COLUMN] = [TABLE B].[COLUMN]
所以这意味着:
SELECT * FROM oc_songs
LEFT JOIN oc_artists ON oc_songs.song_artist_id = oc_artists.artist_id
INNER JOIN oc_songs_tags ON oc_songs.song_id = oc_songs_tags.song_id
理解 JOINS 的简单方法是,它们始终是 FROM 中列出的主要 table 和您正在加入的 table 之间的连词。因此,将 JOIN 子句视为连词列表。
因此,要将 TableA 与 TableB、TableC 和 TableD 连接起来,您可能需要:
SELECT * FROM TableA
JOIN TableB on TableA.tableb_id = TableB.id -- this is first join
JOIN TableC on TableA.tablec_id = TableC.id -- this is second join
JOIN TableD on TableA.tabled_id = TableD.id -- this is third join
示例表:
DROP TABLE IF EXISTS `oc_songs` ;
DROP TABLE IF EXISTS `oc_songs_tags` ;
DROP TABLE IF EXISTS `oc_artists` ;
CREATE TABLE `oc_songs` (
`song_id` int(10) unsigned NOT NULL auto_increment,
`song_name` varchar(255) NOT NULL,
`song_artist_id` int(10),
PRIMARY KEY (`song_id`),
foreign key (`song_artist_id`) references oc_artists(`artist_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
CREATE TABLE `oc_songs_tags` (
`song_tag_id` int(10) unsigned NOT NULL auto_increment,
`song_tag` varchar(255) NOT NULL,
`song_id` int(10),
PRIMARY KEY (`song_tag_id`),
foreign key (`song_id`) references oc_songs(`song_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
CREATE TABLE `oc_artists` (
`artist_id` int(10) unsigned NOT NULL auto_increment,
`artist_age` int(4),
PRIMARY KEY (`artist_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
右select:
SELECT * FROM oc_songs
LEFT JOIN oc_artists ON
oc_songs.song_artist_id = oc_artists.artist_id
INNER JOIN oc_songs_tags ON
oc_songs.song_id = oc_songs_tags.song_id;
我有 3 个表:oc_artists、oc_songs、oc_songs_tags
我可以 select 2 个表使用此代码:
SELECT * FROM `oc_songs` LEFT JOIN oc_songs_tags ON oc_songs.song_id=oc_songs_tags.song_id
WHERE oc_songs_tags.song_tag IS NULL
现在我需要 select 来自 oc_artists 的数据...我试过这个问题的答案: MySQL LEFT JOIN 3 tables
这是我的代码:
SELECT * FROM oc_songs
LEFT JOIN oc_artists
INNER JOIN oc_songs_tags
ON oc_songs.song_artist_id = oc_artists.artist_id
ON oc_songs_tags.song_id = oc_songs.song_id
但是我收到这个错误
8 errors were found during analysis.
Unrecognized keyword. (near "ON" at position 131)
Unexpected token. (near "oc_songs_tags" at position 134)
Unexpected token. (near "." at position 147)
Unexpected token. (near "song_id" at position 148)
Unexpected token. (near "=" at position 156)
Unexpected token. (near "oc_songs" at position 158)
Unexpected token. (near "." at position 166)
Unexpected token. (near "song_id" at position 167)
ON 子句位置错误
SELECT * FROM oc_songs
LEFT JOIN oc_artists ON oc_songs.song_artist_id = oc_artists.artist_id
INNER JOIN oc_songs_tags ON oc_songs_tags.song_id = oc_songs.song_id
你的语法有误。加入语法是:
[JOIN TYPE] JOIN [TABLE B] ON [TABLE A].[COLUMN] = [TABLE B].[COLUMN]
所以这意味着:
SELECT * FROM oc_songs
LEFT JOIN oc_artists ON oc_songs.song_artist_id = oc_artists.artist_id
INNER JOIN oc_songs_tags ON oc_songs.song_id = oc_songs_tags.song_id
理解 JOINS 的简单方法是,它们始终是 FROM 中列出的主要 table 和您正在加入的 table 之间的连词。因此,将 JOIN 子句视为连词列表。
因此,要将 TableA 与 TableB、TableC 和 TableD 连接起来,您可能需要:
SELECT * FROM TableA
JOIN TableB on TableA.tableb_id = TableB.id -- this is first join
JOIN TableC on TableA.tablec_id = TableC.id -- this is second join
JOIN TableD on TableA.tabled_id = TableD.id -- this is third join
示例表:
DROP TABLE IF EXISTS `oc_songs` ;
DROP TABLE IF EXISTS `oc_songs_tags` ;
DROP TABLE IF EXISTS `oc_artists` ;
CREATE TABLE `oc_songs` (
`song_id` int(10) unsigned NOT NULL auto_increment,
`song_name` varchar(255) NOT NULL,
`song_artist_id` int(10),
PRIMARY KEY (`song_id`),
foreign key (`song_artist_id`) references oc_artists(`artist_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
CREATE TABLE `oc_songs_tags` (
`song_tag_id` int(10) unsigned NOT NULL auto_increment,
`song_tag` varchar(255) NOT NULL,
`song_id` int(10),
PRIMARY KEY (`song_tag_id`),
foreign key (`song_id`) references oc_songs(`song_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
CREATE TABLE `oc_artists` (
`artist_id` int(10) unsigned NOT NULL auto_increment,
`artist_age` int(4),
PRIMARY KEY (`artist_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
右select:
SELECT * FROM oc_songs
LEFT JOIN oc_artists ON
oc_songs.song_artist_id = oc_artists.artist_id
INNER JOIN oc_songs_tags ON
oc_songs.song_id = oc_songs_tags.song_id;