【问题标题】:SQL Join SQLzooSQL 加入 SQLzoo
【发布时间】:2014-12-18 17:30:13
【问题描述】:

在 MySQL 的 More Join operations 下的 SQLzoo 上存在问题。 问的问题是

按演员人数排列 1978 年上映的电影。

给出的表格如下,ord 的值为 0 或 1,1 为明星角色。

movie | actor | casting
id       id      movieid
yr       name    actorid
title             ord
budget
gross
director

我按如下方式编写了我的 SQL 查询,SQLzoo 并没有告诉我我有正确的答案,但我相信我的查询是正确的。有人可以验证这一点并可能告诉我如何在没有子查询的情况下做到这一点吗?谢谢!

SELECT DISTINCT 
  movie.title, f.num_actors
FROM
  (SELECT
     casting.movieid,COUNT(casting.actorid) AS num_actors
   FROM
     casting
   GROUP BY
     casting.movieid ) f
JOIN
  movie ON f.movieid = movie.id
WHERE
  movie.yr = 1978
ORDER BY
  2 DESC

【问题讨论】:

  • 你为什么要使用ORDER BY 2 DESC?这是否意味着您正在尝试按SELECT 语句中的第二列排序?我开始学习 SQL,如果这是一个新手问题,很抱歉。
  • @user1330974 是的,按 n 排序只会按最终表格中的第 n 列排序

标签: mysql sql sql-server sqlite


【解决方案1】:
SELECT title, COUNT(actorid) AS actors FROM movie
JOIN casting ON id = movieid
WHERE yr = 1978
GROUP BY title
ORDER BY actors DESC

【讨论】:

  • 欢迎来到 Stack Overflow!请使用四个空格缩进代码以启用语法突出显示。这一次,我已经为你做了:)这个页面可能很有趣:Markdown help
【解决方案2】:
SELECT title,count(actorid) FROM movie join casting on movie.id=movieid join
actor on actor.id=actorid WHERE yr='1978' GROUP by title ORDER by
count(actorid) desc, title

大家好,我知道我来晚了,但仍会尽力提供帮助 :) 我就是这样做的。部分说明是按演员人数排序,然后按头衔。解释代码的最后一部分。

【讨论】:

    【解决方案3】:
    select title, count(actorid)
    from movie 
    join casting on movie.id = movieid
    where yr = 1978
    group by title
    order by count(actorid) desc, title asc
    

    【讨论】:

      【解决方案4】:

      看起来 SQLzoo 数据现在“已损坏”,并且它不接受正确的查询。下面会给你两个看起来不正确的条目。

      选择 * 来自 铸造其中movieid = 20136 和actorid = 179 按顺序排列

      【讨论】:

        【解决方案5】:

        SQLZoo 没有问题,但您必须将 SQL 的最后一部分从 2 DESC 更改为 f.num_actors DESC, title。以下是您的 sql 的修改版本:

        SELECT DISTINCT 
          movie.title, f.num_actors
         FROM
          (SELECT
             casting.movieid,COUNT(casting.actorid) AS num_actors
            FROM
            casting
            GROUP BY
            casting.movieid ) f
         JOIN movie ON f.movieid = movie.id
        WHERE movie.yr = 1978
        ORDER BY f.num_actors DESC, title
        

        不使用内部选择的另一种解决方法是:

        SELECT title, count(casting.actorid)
         FROM movie 
                   JOIN casting ON casting.movieid = movie.id
         WHERE yr=1978
         GROUP BY title
         ORDER BY count(casting.actorid) DESC, title
        

        【讨论】:

          【解决方案6】:

          答案比较简单

          select title, count(actorid) from movie join casting on movie.id=movieid join actor on actor.id=actorid where yr=1978 group by title order by count(actorid) desc, title

          【讨论】:

            【解决方案7】:

            你可以先加入,再分组:

            SELECT movie.*
            FROM movie
            JOIN casting ON movie.id = casting.movieid
            WHERE movie.yr = 1978
            GROUP BY movie.id
            ORDER BY COUNT(*) DESC
            

            【讨论】:

            • 其中有两个 SQL 反字符。非常糟糕的代码。
            • @HLGEM 你能解释一下上面代码中的反模式吗?
            • 选择 * 的使用和 group by 的非常糟糕的错误使用。建议你阅读关于 sql 反模式的书,你可以在亚马逊上找到它。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-03-06
            • 2023-03-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多