【问题标题】:mysql left join and inner join 3 tablesmysql左连接和内连接3个表
【发布时间】:2016-08-31 20:10:38
【问题描述】:

我有 3 个表:oc_artists、oc_songs、oc_songs_tags

我可以使用此代码选择 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)

【问题讨论】:

    标签: mysql left-join inner-join


    【解决方案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 和 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
    

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

        【解决方案3】:

        示例表:

        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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-02-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-03
          • 1970-01-01
          • 2014-10-29
          • 1970-01-01
          相关资源
          最近更新 更多