1
votes

Comment puis-je filtrer l'ordre des informations en fonction de deux facteurs différents sur SQL?

J'ai les trois tableaux suivants:

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

Je veux exécuter un SELECT pour vérifier quelle personne a le plus grand nombre de popularité code > MAIS a participé à moins de films, mais a participé à moins de films.

Comment puis-je faire cela?

Pour vérifier la personne la plus populaire, j'exécuterais ceci:

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

Et, si j'ai raison, pour vérifier la personne qui a participé à moins de films, j'exécuterais ceci:

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

Mais, comment puis-je filtrer les deux cas en un seul SELECT?

Merci d'avance.

MODIFIER

I ' m en utilisant MySQL.

Je vais également donner un exemple de ce que j'essaie d'obtenir:

Table Person

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

Table Movie

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);

Table Person_Movie

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;

Donc, étant donné cet exemple, le résultat que je voudrais obtenir est:

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)
);

Parce que les deux personnes avec l'identifiant 1 et 3 ont participé à UN seul film, mais la personne avec l'identifiant 3 a le plus grand nombre de popularité.


2 commentaires

Des échantillons de données, les résultats souhaités et une étiquette de base de données appropriée seraient utiles. Apprenez également à utiliser la syntaxe JOIN appropriée, explicite, standard et lisible.


Apprenez à utiliser correctement JOIN . Il existe depuis plus de 25 ans.


3 Réponses :


1
votes

Que diriez-vous de ceci:

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;

Cela trierait vos résultats en fonction du nombre de films si plusieurs personnes ont la même popularité. Si vous ne voulez que la première ligne, vous pouvez utiliser le premier 1. J'espère que cela vous aidera.

Modifier:

D'après les exemples de cas, il semble que la première priorité de tri devrait comptez:

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);


2 commentaires

C'est ce que je cherchais, merci. L'ordre des conditions de la clause order by a-t-il une hiérarchie? Lequel prédomine?


À l'heure actuelle, la popularité est la priorité puisqu'elle est mentionnée en premier. Count (ID) entre dans l'image uniquement lorsqu'il y a plusieurs ID avec la même popularité



1
votes

Il semble que vous souhaitiez donner la priorité au nombre de films comme première expression dans ORDER BY, puis utiliser la popularité pour rompre les liens. Voici une requête avec une clause ORDER BY qui accomplit cela:

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

Voici un fiddle en fonction de vos exemples de données.


1 commentaires

S'il vous plaît, pouvez-vous expliquer ce que fait la dernière ligne? (après ORDER BY popularité DESC )



1
votes

En regardant la sortie souhaitée, je suppose que vous voulez sélectionner les personnes qui ont participé au plus petit nombre de films parmi ceux qui sont les plus populaires. (Je suppose que la popularité est votre première priorité) Ensuite, la requête suivante pourrait fonctionner dans 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(*)

La première sous-requête renvoie les personnes les plus populaires, puis j'ai essayé de les trier par le nombre de films auxquels elles ont assisté. (si vous n'avez besoin que d'un seul résultat, vous pouvez ajouter un LIMIT 1 à la fin)


0 commentaires