sakila datenbank übung

thobuc

Neuer Benutzer
Beiträge
4
Hallo,
ich habe eine Übungsaufgabe erhalten, diese Bezieht sich auch die SAKILA-Datenbank.
Im Internet kann man das Schema dazu sehr leicht finden. Weiterleitungshinweis

Folgender Script gib mir für den Kunden mit der ID 2 aus, welcher Schauspieler( nur die ID es Schauspielers ) am häufigsten in den ausgeliehenen Filmen mitgespielt hat.

Jetzt soll dieses Script jedoch für alle Kunden (TABELLE customer >> customer_id)
durchgeführt werden. Hat von euch jemand eine Idee, wie ich das umsetzen kann?

Ich verwende MYSQL(MARIADB) mit der MYSQL-Workbench

Mit freundlichen Grüßen
thobuc

Code:
SELECT TBL_AID_ACN.actor_id

    FROM
    (SELECT fac.actor_id AS actor_id, COUNT(*) AS count_actor
        FROM rental r
        INNER JOIN inventory i ON r.inventory_id = i.inventory_id
        INNER JOIN film_actor fac ON i.film_id = fac.film_id
        WHERE r.customer_id = 2
        GROUP BY fac.actor_id) TBL_AID_ACN /*actor_id, count OF cunsomer*/

    WHERE TBL_AID_ACN.count_actor =
    (SELECT MAX(TBL_AID_ACN.count_actor)
     
        FROM (SELECT fac.actor_id AS actor_id, COUNT(*) AS count_actor FROM rental r
            INNER JOIN inventory i ON r.inventory_id = i.inventory_id
            INNER JOIN film_actor fac ON i.film_id = fac.film_id
            WHERE r.customer_id = 2
            GROUP BY fac.actor_id) TBL_AID_ACN /*actor_id, count OF cunsomer*/
      )
 
Werbung:
Kleine Information: Die komplette Aufgabenbeschreibung sieht wie folgt aus:
Zu jedem Kunden (customer) den (first_name, last_name) ausgeben und den Lieblingsschauspieler (actor) mit (acotr_id, first_name, last_name), danach Soll noch die Anzahl der Filme in denen Dieser mitgespielt hat ausgegeben werden. Ob jetzt die Anzahl der Filme im Gesamten oder nur die Anzahl der Filme, aus denen die ausgeliehen wurden, ist nicht eindeutig formuliert. Jedoch ist die Definition für Lieblingsschauspieler folgende: Der Schauspieler, der in den meisten geliehenen Filmen mit gespielt hat.

Mit freundlichen Grüßen
thobuc
 
Hier mal ein Komplet anderer Ansatz. Ich habe die Aufgabe jetzt folgendermaßen gelöst.
Vielleicht könntet Ihr das ganze mal überfliegen und Verbesserungen vorschlagen, falls jemand belesen genug ist,
die ganze Sache überhaupt zu verstehen. Ich hatte mächtig Probleme damit und bin mir nicht mal sicher,
dass ich hier keinen Denkfehler drin habe.

Code:
SELECT J1.cln, J1.cfn, J1.aid, J1.aln, J1.afn, MAX(J1.count) acn FROM customer _c  
    INNER JOIN ( SELECT c.customer_id cid, c.last_name cln, c.first_name cfn, ACOTR.aid aid, ACOTR.aln aln, ACOTR.afn afn, COUNT(ACOTR.aid) count
    FROM customer c

        INNER JOIN ( SELECT r.customer_id cid, a.actor_id aid, a.last_name aln, a.first_name afn FROM rental r
            INNER JOIN inventory i ON r.inventory_id = i.inventory_id
            INNER JOIN film_actor fac ON i.film_id = fac.film_id
            INNER JOIN actor a ON fac.actor_id = a.actor_id
        ) ACOTR ON c.customer_id = ACOTR.cid
        GROUP BY c.customer_id, ACOTR.aid

    ) J1 ON _c.customer_id = J1.cid
    GROUP BY _c.customer_id
;
 
Werbung:
Hallo,
der Letzte Post ist fehlerhaft. Ich weis leider nicht wie ich diesen löschen kann.
Hier jetzt hoffentlich endgültig die korrekte Lösung:

Code:
SELECT T1.last_name, T1.first_name, T1.aid, T1.aln, T1.afn, T1.count
FROM    (    SELECT c.customer_id, c.last_name, c.first_name, ACOTR.aid, ACOTR.aln, ACOTR.afn, COUNT(ACOTR.aid) count    -- T1
            FROM customer c
            INNER JOIN    (    SELECT r.customer_id cid, a.actor_id aid, a.last_name aln, a.first_name afn                    -- ACTOR
                            FROM rental r
                            INNER JOIN inventory i ON r.inventory_id = i.inventory_id
                            INNER JOIN film_actor fac ON i.film_id = fac.film_id
                            INNER JOIN actor a ON fac.actor_id = a.actor_id
                        )    ACOTR ON c.customer_id = ACOTR.cid
            GROUP BY c.customer_id, ACOTR.aid
        )    T1

WHERE T1.count = ( SELECT MAX(T2.count) FROM    (    SELECT c.customer_id, c.last_name, c.first_name, ACOTR.aid, ACOTR.aln, ACOTR.afn, COUNT(ACOTR.aid) count    -- T2
                                                    FROM customer c
                                                    INNER JOIN    (    SELECT r.customer_id cid, a.actor_id aid, a.last_name aln, a.first_name afn                    -- ACTOR
                                                                    FROM rental r
                                                                    INNER JOIN inventory i ON r.inventory_id = i.inventory_id
                                                                    INNER JOIN film_actor fac ON i.film_id = fac.film_id
                                                                    INNER JOIN actor a ON fac.actor_id = a.actor_id
                                                                )    ACOTR ON c.customer_id = ACOTR.cid
                                                    GROUP BY c.customer_id, ACOTR.aid
                                                ) T2
                                        WHERE T2.customer_id = T1.customer_id
                )


;
 
Zurück
Oben