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é.
3 Réponses :
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);
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é
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.
S'il vous plaît, pouvez-vous expliquer ce que fait la dernière ligne? (après ORDER BY popularité DESC )
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)
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
JOINappropriée, explicite, standard et lisible.Apprenez à utiliser correctement
JOIN. Il existe depuis plus de 25 ans.