2016-05-05 4 views
-2

Ich habe 3 Tabellen: oc_artists, oc_songs, oc_songs_tagsmysql LEFT JOIN und innere Verknüpfung 3 Tabellen

I 2 Tabellen mit diesem Code auswählen:

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 

Jetzt brauche ich Daten von oc_artists auszuwählen. .. ich habe versucht, diese Fragen zu beantworten: MySQL LEFT JOIN 3 tables

Und hier ist mein Code:

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 

Aber ich bekomme diese Fehlermeldung

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) 

Antwort

1

Ihre Syntax ist falsch. Join-Syntax ist:

[JOIN TYPE] JOIN [TABLE B] ON [TABLE A].[COLUMN] = [TABLE B].[COLUMN] 

So bedeutet, dass würde:

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 

Der einfache Weg JOINS zu verstehen ist, dass sie immer eine Verbindung zwischen der primären Tabelle sind aufgelistet in FROM und die Tabelle, die Sie verbinden. Betrachten Sie die JOIN-Klausel als eine Liste von Konjunktionen.

So TableA mit TableB, TableC, zu verbinden und TABLED könnten Sie so etwas wie haben:

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

Falsche Position der ON-Klausel

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

Beispiel Tabellen:

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; 

Rechts wählen:

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;