【问题标题】:How to use aliases with MySQL LEFT JOIN如何在 MySQL LEFT JOIN 中使用别名
【发布时间】:2011-12-08 12:22:27
【问题描述】:

我的原始查询是使用 WHERE 子句而不是 JOIN 进行连接。我意识到这不是返回没有任何明星或流派的电影没有出现,所以我认为我必须做一个 LEFT JOIN 才能展示每部电影。这是我的原始 SQL:

SELECT *
FROM movies m, stars s, stars_in_movies sm, genres g, genres_in_movies gm
WHERE m.id = sm.movie_id
AND sm.star_id = s.id
AND gm.genre_id = g.id
AND gm.movie_id = m.id
AND m.title LIKE '%the%'
AND s.first_name LIKE '%Ben%'
ORDER BY m.title ASC
LIMIT 5;

我尝试对电影进行 LEFT JOIN,但我肯定做错了什么。

SELECT *
FROM movies m, stars s, stars_in_movies sm, genres g, genres_in_movies gm
LEFT JOIN movies m1 ON m1.id = sm.movie_id
LEFT JOIN movies m2 ON m2.id = gm.movie_id
AND sm.star_id = s.id
AND gm.genre_id = g.id
ORDER BY m.title ASC
LIMIT 5;

我得到ERROR 1054 (42S22): Unknown column 'sm.movie_id' in 'on clause' 很明显我做错了加入,我只是不明白它是什么。

【问题讨论】:

  • 嘎啊。将懒惰的FROM table,table,table 与适当的完全指定的连接混合起来非常难看。

标签: mysql sql join left-join


【解决方案1】:

不要将逗号运算符与JOIN 混用——它们有不同的优先级! manual 中甚至对此有警告:

但是,逗号运算符的优先级低于 INNER JOIN、CROSS JOIN、LEFT JOIN 等。如果在存在连接条件时将逗号连接与其他连接类型混合使用,则可能会出现Unknown column 'col_name' in 'on clause' 形式的错误。本节稍后会提供有关处理此问题的信息。

试试这个:

SELECT *
FROM movies m
LEFT JOIN (
   stars s
   JOIN stars_in_movies sm
       ON sm.star_id = s.id
) ON m.id = sm.movie_id AND s.first_name LIKE '%Ben%'
LEFT JOIN (
    genres g
    JOIN genres_in_movies gm
        ON gm.genre_id = g.id
) ON gm.movie_id = m.id
WHERE m.title LIKE '%the%'
ORDER BY m.title ASC
LIMIT 5;

【讨论】:

  • 我觉得AND m.title LIKE '%the%'应该是WHERE m.title LIKE '%the%'吧?
  • 应该是另一个 AND 的 WHERE 吗?例如,如果我想做名字和姓氏:JOIN stars_in_movies sm ON sm.star_id = s.id WHERE s.first_name LIKE '%Ben%' AND s.last_name LIKE '%Stiller%'
  • @styfle:不。我什至不认为在 WHERE 那里写 SQL 是有效的。
  • @styfle:我把这个条件移到另一个我认为更有意义的地方。
  • 这两种方式对我来说仍然有点令人困惑,因为表别名是在括号外使用的。但我不能抱怨,因为这行得通!
【解决方案2】:

您应该将与您的 JOIN 相关的条件放在同一个 ON 子句中。但是,对于您的上述问题,您应该使用以下查询:

SELECT *
FROM movies m 
LEFT JOIN stars_in_movies sm ON sm.movie_id = m.id
JOIN stars s ON sm.star_id = s.id
LEFT JOIN genres_in_movies gm ON gm.movie_id = m.id
JOIN genres g ON gm.genre_id = g.id
ORDER BY m.title ASC
LIMIT 5;

【讨论】:

    【解决方案3】:

    也许丑陋,但它的工作方式就在这里。当心这很丑陋,很多人都在警告这种黑客行为

    SELECT *
    FROM movies m, stars_in_movies sm LEFT JOIN movies m1 ON m1.id = sm.movie_id, stars s
    ORDER BY m.title ASC
    LIMIT 5;
    

    当使用连接时,您必须使用包含您要比较的列的正确表进行连接。

    【讨论】:

      【解决方案4】:

      SQL Join(MySQL 中的内连接)

      select emp1.id,emp1.name,emp1.job  from (select id, type as name, description as job from component_type as emp1)emp1
      inner join 
      emp
      on emp1.id=emp.id;
      

      左连接

      select emp1.id,emp1.name,emp1.job  from (select id, type as name, description as job from component_type as emp1 where id between '1' AND '5')emp1
      left join 
      emp
      on emp1.id=emp.id;
      

      右连接

      select emp1.id,emp1.name,emp1.job  from (select id, type as name, description as job from component_type as emp1)emp1
      Right join 
      (select * from emp where id between '1' and '5')exe
      on emp1.id=exe.id;
      

      【讨论】:

      • 所有例子都是基于别名的,有些表有不同的列名,但数据是相同的属性..
      【解决方案5】:

      使用别名连接多个表而不使用连接..

      select sum(s.salary_amount) as total_expenses_paid_to_all_department
      from salary_mas_tbl s,dept_mas_tbl d
      where s.salary_dept=d.dept_id;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-03
        • 2012-05-14
        • 1970-01-01
        • 2011-10-13
        • 2013-05-22
        • 1970-01-01
        • 1970-01-01
        • 2015-02-18
        相关资源
        最近更新 更多