Ich habe die drei folgenden Tabellen:

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

Ich möchte ein SELECT ausführen, um zu überprüfen, welche Person die höhere Anzahl von popularity hat, ABER aber an weniger Filmen teilgenommen hat.

Wie kann ich das machen?

Um die beliebteste Person zu überprüfen, würde ich Folgendes ausführen:

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;

Und wenn ich richtig liege, würde ich Folgendes ausführen, um die Person zu überprüfen, die an weniger Filmen teilgenommen hat:

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

Aber wie kann ich die beiden Fälle in einem SELECT filtern?

Danke im Voraus.

BEARBEITEN

Ich benutze MySQL.

Außerdem werde ich ein Beispiel dafür geben, was ich versuche zu bekommen:

Tischperson

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

Tischfilm

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

Tabelle Person_Movie

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

In diesem Beispiel möchte ich folgende Ausgabe erhalten:

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

Weil beide Personen mit der ID 1 und 3 an nur EINEM Film teilgenommen haben, aber die Person mit der ID 3 die höhere Beliebtheit hat.

1
user157629 19 Feb. 2020 im 20:11

3 Antworten

Beste Antwort

Wie wäre es damit:

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

Dies würde Ihre Ergebnisse nach der Anzahl der Filme sortieren, wenn mehrere Personen dieselbe Popularität haben. Wenn Sie nur die erste Zeile möchten, können Sie eine Top 1 verwenden. Ich hoffe, dies hilft.

Bearbeiten:

Basierend auf den Beispielfällen sieht es so aus, als ob die erste Priorität der Sortierung zählen sollte:

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;
1
CR7SMS 19 Feb. 2020 im 17:31

Ich gehe davon aus, dass Sie die Personen auswählen möchten, die an der niedrigsten Anzahl von Filmen teilgenommen haben, und zwar unter den beliebtesten. (Ich gehe davon aus, dass Popularität Ihre erste Priorität ist.) Dann könnte die folgende Abfrage in MySQL funktionieren

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(*)

Die erste Unterabfrage gibt die beliebtesten Personen zurück, und dann habe ich versucht, sie nach der Anzahl der Filme zu sortieren, die sie besucht haben. (Wenn Sie nur ein einziges Ergebnis benötigen, können Sie am Ende ein LIMIT 1 hinzufügen.)

1
Maryam 19 Feb. 2020 im 18:42

Es hört sich so an, als ob Sie der Anzahl der Filme als erstem Ausdruck in ORDER BY Vorrang einräumen und dann die Popularität verwenden möchten, um Bindungen zu lösen. Hier ist eine Abfrage mit einer ORDER BY-Klausel, die dies erreicht:

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

Hier ist eine Geige basierend auf Ihren Beispieldaten.

1
Max Szczurek 20 Feb. 2020 im 21:46