按第三个表中的状态排序表

时间:2014-03-04 00:40:45

标签: mysql

我有一个电影数据库,其中包含演员表和另一个电影表,我创建了第三个表来在电影中添加演员参与者。我添加了一个领域“明星”来区分领先演员和非领导演员。 我希望根据演员的重要性以及“星星”的总数创建一个列表顺序。

SELECT a.id, a.name, COUNT( p.star ) AS star
FROM actors a
JOIN playing p, movies m
WHERE p.id_actor = a.id
AND p.id_movie = m.id
AND p.star =1
GROUP BY p.star
ORDER BY p.star DESC;

ACTORS

+----+---------+
| id |  name   |
+----+---------+
|  1 | actor01 |
|  2 | actor02 |
|  3 | actor03 |
+----+---------+

MOVIES

+----+----------+
| id |  title   |
+----+----------+
|  1 | movie01  |
|  2 | movie02  |
|  3 | movie03  |
+----+----------+

PLAYING

+----------+----------+-------+------+
| id_movie | id_actor | char  | star |
+----------+----------+-------+------+
|        1 |        1 | char1 |    0 |
|        1 |        2 | char2 |    1 |
|        2 |        3 | char3 |    1 |
+----------+----------+-------+------+

我需要输出像:

+----------+--------------+
|    actor |  protagonist |
+----------+--------------+
|  actor01 |    2 times   |
|  actor02 |    3 times   |
+----------+--------------+

2 个答案:

答案 0 :(得分:2)

您需要通过 actor 而不是 star 列来修复group by子句。您需要将order by按聚合列修复,而不是原始列:

SELECT a.id, a.name, sum( p.star = 1) AS stars
FROM actors a join playing p
     on p.id_actor = a.id join
     movies m
     on p.id_movie = m.id
GROUP BY a.id, a.name
ORDER BY stars DESC;

在此过程中,我修复了from,因此它使用了正确的join语法(带有on子句)。并更改了查询,以便返回所有演员,甚至那些从未成为明星的演员。

答案 1 :(得分:1)

1.如果你想算一个演员的所有明星,你应该按演员而不是明星分组。(除非你想要算一个演员在电影中获得1星的次数,你可能不想分组星)

2.您可能希望将ONJOIN

一起使用

3.您可能希望ORDER BY star而不是ORDER BY p.star,因为您想按结果排序。

4.您可能希望使用SUM代替COUNT来获取星号。(SUM计算值,COUNT计算数字。{{ 1}},您可以将星值设置为您想要的任何值而无需更改您的sql。您可以使用star = 2来显示actor对电影很重要或者让star = -1,这意味着演员会发臭。)

您可以查看下面的sql:

SUM