2016-05-05 3 views
-2

у меня есть 3 таблицы: oc_artists, oc_songs, oc_songs_tagsMySQL покинул присоединиться и внутреннее соединение 3 таблицы

можно выбрать 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 

Теперь мне нужно выбрать данные из 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) 

ответ

1

Ваш синтаксис является неправильным. Регистрация Синтаксис:

[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 и таблице вы присоединяетесь. Поэтому рассмотрите предложение JOIN как список союзов.

Так присоединиться TABLEA с TableB, TableC и внесенного вы могли бы что-то вроде:

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 
1

Неправильное положение пункта 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 
1

Пример таблицы:

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 * 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; 
Смежные вопросы