【问题标题】:How can I filter information ordering by two different factors on SQL?如何通过 SQL 上的两个不同因素过滤信息排序?
【发布时间】:2023-04-07 17:33:01
【问题描述】:

我有以下三个表:

create table Person (

    id int,
    popularity int,
    primary key (id)
);

create table Movie (

    id int,
    year int,
    primary key (id)
);

create table Person_Movie (

    id_person int,
    id_movie int,
    primary key (id_person, id_movie),
    foreign key (id_person) references Person (id_person),
    foreign key (id_movie) references Movie (id_movie)
);

我想执行SELECT 来检查哪个人拥有更多popularity 但参与的电影较少。

我该怎么做?

要检查最受欢迎的人,我会执行此操作:

select P.id from Person as P, Movie as M, Person_Movie as PM
where P.id = PM.id and PM.id = M.id
group by (P.id)
order by popularity;

而且,如果我是正确的,为了检查参与较少电影的人,我会执行以下操作:

select P.id from Person as P, Movie as M, Person_Movie as PM
where P.id = PM.id and PM.id = M.id
group by (P.id)
order by count(M.id);

但是,我怎样才能在一个SELECT 中过滤这两种情况?

提前致谢。

编辑

我正在使用 MySQL。

另外,我将提供一个我想要得到的示例:

桌人

id      popularity
-------------------
1          50
2          35
3          120
4          45

桌面电影

id        year
----------------
1         1999
2         2014
3         1969
4         1977
5         2019

Table Person_Movie

id_person       id_movie
--------------------------
    1              1
    2              4
    2              5
    3              3
    4              1
    4              2

所以,给定这个例子,我想得到的输出是:

id_person
----------
    3

因为ID为13的人都只参加过一部电影,而ID为3的人的热度更高。

【问题讨论】:

  • 样本数据、所需结果和适当的数据库标签会有所帮助。此外,学习使用正确、明确、标准、可读的JOIN 语法。
  • 了解如何正确使用JOIN。它已经存在超过 25 年了。

标签: mysql sql filter


【解决方案1】:

这个怎么样:

select P.id from Person as P, Movie as M, Person_Movie as PM
where P.id = PM.id and PM.id = M.id
group by (P.id)
order by max(popularity),count(M.id);

如果多人具有相同的受欢迎程度,这将按电影数量对您的结果进行排序。如果您只想要第一行,则可以使用前 1 行。希望这会有所帮助。

编辑:

根据样例,排序的第一优先级应该是计数:

select P.id from Person as P, Movie as M, Person_Movie as PM
where P.id = PM.id and PM.id = M.id
group by (P.id)
order by count(M.id),max(Popularity) desc;

【讨论】:

  • 这就是我正在寻找的,谢谢。 order by 子句上的条件顺序是否有任何层次结构?哪个占主导地位?
  • 现在人气优先,因为它首先被提及。 Count(ID) 仅在有多个具有相同人气的 ID 时才会出现
【解决方案2】:

查看您想要的输出,我假设您想从最受欢迎的电影中选择参与电影数量最少的人。 (我认为人气是你的首要任务) 那么下面的查询可能会在 MySQL 中工作

select A.id  
from (select id from Person where popularity=(select max(popularity) from Person)) A, Person_Movie B
where A.id = B.id 
group by A.id
order by count(*)

第一个子查询返回最受欢迎的人,然后我尝试按他们观看的电影数量对他们进行排序。 (如果您只需要一个结果,您可以在最后添加LIMIT 1

【讨论】:

    【解决方案3】:

    听起来你想优先考虑电影数量作为 ORDER BY 中的第一个表达式,然后使用流行度来打破平局。这是一个带有 ORDER BY 子句的查询:

    SELECT TOP 1 id
    FROM Person
    ORDER BY (SELECT COUNT(*) FROM dbo.Person_Movie WHERE id_person = Person.id) ASC, 
        popularity DESC     
    

    这是基于您的样本数据的fiddle

    【讨论】:

    • 拜托,你能解释一下最后一行是做什么的吗? (在ORDER BY popularity DESC 之后)
    猜你喜欢
    • 1970-01-01
    • 2017-09-23
    • 2019-01-30
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 2012-10-05
    相关资源
    最近更新 更多