我有一个电影数据库,其中包含演员表和另一个电影表,我创建了第三个表来在电影中添加演员参与者。我添加了一个领域“明星”来区分领先演员和非领导演员。 我希望根据演员的重要性以及“星星”的总数创建一个列表顺序。
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 |
+----------+--------------+
答案 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.您可能希望将ON
与JOIN
3.您可能希望ORDER BY star
而不是ORDER BY p.star
,因为您想按结果排序。
4.您可能希望使用SUM
代替COUNT
来获取星号。(SUM
计算值,COUNT
计算数字。{{ 1}},您可以将星值设置为您想要的任何值而无需更改您的sql。您可以使用star = 2来显示actor对电影很重要或者让star = -1,这意味着演员会发臭。)
您可以查看下面的sql:
SUM