2017-10-08 4 views
0

Ich muss das Konto finden, das die maximale Anzahl von bevorzugten Videos hat, aber ich bin nicht sicher, wie die Konto-ID zu erhöhen, um alle Konten durchlaufen.So finden Sie MAX mit einem Cursor in einer Schleife

Ich weiß, wie Sie die Anzahl der bevorzugten Videos pro Konto finden.

DECLARE 
    userid NUMBER(3) := 2; 
    CURSOR items IS 
     SELECT id_account 
     FROM favorites; 
    counter NUMBER(3) := 0; 
BEGIN 
    FOR x IN items LOOP 
     IF x.id_account = userid THEN 
      counter := counter + 1; 
     END IF; 
    END LOOP; 

    dbms_output.Put_line(counter); 
END; 

Edit1: Danke für die Antworten, aber ich vergaß zu erwähnen, dass ich einen Cursor als Ziel

Hier zu üben verwenden müssen, meinen Tisch Favoriten ist (id_account [PK, FK], id_video [ PK, FK])

EDIT2: Danke das genau ist will ich

+0

Konto-ID wird von Table Rite abgerufen? Also müssen Sie es am Ende des Programms aktualisieren oder kann ich den Zweck der Konto ID Inkrement wissen? –

+0

Ich wollte die ID erhöhen, um die Anzahl der favorisierten Videos für jeden account mit meinem Loop-Counter zu erhalten. Dies ist der einzige Weg, ich dachte, es könnte funktionieren – Khazios

+0

Videos und alles ist dein Szenario ... sag mir eine Sache .. ** ID ** bedeutet ** ID_Account **, die aus 'Favoriten' Tisch Ritus ist? ur qustn ist nicht mit Code verbunden und was hast du gefragt? bitte klären Sie Ihre genaue Anforderung, teilen Sie Ihre Tabellenstruktur, dann werden wir Ihnen nur helfen !! –

Antwort

0

wollte Es gibt keinen Grund, Dinge zu komplizieren ist mit PL/SQL, wenn einfache SQL dieses f tun können oder du.

Zum Beispiel wird diese Abfrage geben Sie Konto-IDs und Anzahl der Lieblingsvideos, nach Anzahl der Lieblingsvideos sortiert (von meisten zum niedrigsten):

select id_account, count(*) 
    from favorites 
group by id_account 
order by 2 desc; 

Nun müssen Sie entscheiden, was zu tun, wenn Mehr als ein Konto hat dieselbe Anzahl an Lieblingsvideos - zeigst du sie alle oder nur eins (zufällig)?

Die folgende Abfrage wird nur ein Konto zurück:

select * 
    from (select id_account, count(*) num_fav_videos 
      from favorites 
     group by id_account 
     order by 2 desc) 
where rownum = 1; 

Bitte beachten Sie, dass diese Abfragen besonders effizient nicht sein - sie Daten für jede einzelne Konto-ID und als Sortierdaten zu aggregieren haben.

[Bearbeiten] Da die Verwendung von Cursors erforderlich ist (ich stimme dieser Anforderung nicht zu!), Können Sie mit einem Cursor eine Schleife durchlaufen und Zwischendaten in separaten Variablen speichern.

Im folgenden Beispiel setze ich Zähler und maximale Anzahl auf 0 und gehe dann durch alle Konten, die in der Tabelle gespeichert sind, die Konten und Lieblingsvideos verbindet. Ich speichere die aktuelle Konto-ID und inkrementiere die Anzahl der Videos für dieses Konto, bis sich der Cursor ändert oder ich in die letzte Zeile komme. Ich vergleiche dann die Anzahl der Lieblingsvideos dieses Kontos mit der aktuellen maximalen Anzahl an Videos. Wenn diese Zahl größer ist, speichere ich die maximale Anzahl von Videos und die Kontonummer.

declare 
    cursor items is 
    select id_account 
     from favorites 
    order by id_account; 

    id_account_curr number; 
    id_account_max number; 
    max_count number; 
    counter number; 
begin 
    counter := 0; 
    max_count := 0; 
    for x in items loop 
    if x.id_account = id_account_curr then -- while account is the same increment number of favorite videos 
     counter := counter + 1; 
    else 
     if counter > max_count then 
     max_count := counter; 
     id_account_max := id_account_curr; 
     end if; 
     id_account_curr := x.id_account; -- change current account id 
     counter := 1; -- practice question: why is counter set to 1 and not 0? 
    end if; 
    end loop; 
    if counter > max_count then -- practice question: what is this for? 
    max_count := counter; 
    id_account_max := id_account_curr; 
    end if; 
    dbms_output.put_line('id_account: ' || to_char(id_account_max) || ', count: ' || to_char(max_count)); 
end; 
+0

Dies ist genau das, was ich tun muss, aber ich kann keine Aggregatfunktionen verwenden. Macht es Ihnen etwas aus, mir einen Weg zu zeigen, es mit einem Cursor zu machen? Danke – Khazios

+0

Diese Anforderung ist lächerlich - Schleifen auf diese Weise ist in Ordnung für einige andere Sprachen (z. B. Pascal), aber beim Arbeiten mit Datenbanken sollten Sie Code schreiben, der für Datenbanken am effizientesten ist - das heißt SQL-Abfragen schreiben anstelle von Cursoren und Schleifen in PL/SQL, wann immer es angebracht ist. Dies ist nur das falsche Beispiel zum Üben von Loops.Das heißt, Sie können dies mit nur einem Cursor lösen, aber die Daten müssten nach Konto-ID sortiert sein, und Sie sollten Zwischendaten (aktuelle Konto-ID, maximale Anzahl der Favoriten, Konto-ID mit maximalen Favoriten) in separaten Variablen speichern. –

Verwandte Themen