Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Minimum herausfinden

Dieses Thema im Forum "PostgreSQL" wurde erstellt von Smoketm, 21 Juni 2017.

  1. Smoketm

    Smoketm Benutzer

    Hallo,

    ich komme gleich zu Sache, da ich einfach nicht weiter komme und ich nicht weiss was in der Anfrage noch falsch ist.

    Meine Anfrage:
    Code:
    SELECT MIN(followeenickname) as followercount, nickname
    FROM person, follows
    WHERE person.nickname = follows.followeenickname AND
    person.nickname LIKE %(pattern)s
    GROUP BY nickname
    Die Tabellen mit denen ich arbeite.

    followernickname | followeenickname
    -------------------+-------------------
    Huber | Maier
    ..
    ..

    nickname | firstname | lastname | password | birthdate
    -------------------+-------------+------------+--------------+---------------------
    gogo1 | Mike | Huber | pw1 | 1960-01-03 00:00:00

    Aufgabenstellung:
    Man soll den Nicknamen der Person mit der geringsten Followeranzahl ausgeben.

    Ich hoffe, ihr könnt mir helfen.

    LG
     
  2. akretschmer

    akretschmer Datenbank-Guru

    bekommst eine Fehlermeldung? Wenn ja, welche?

    Deine Like-Prüfung erscheint komisch.
     
  3. Smoketm

    Smoketm Benutzer

    Fehlermeldung nicht aber min(followeenickname) gibt mir Namen und keine Zahl,wobei ich eine Zahl brauche, da eben das Minimum ausgegeben werden soll.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    ah ja. wenn du zählen willst, wäre count() wohl besser ...
     
  5. Smoketm

    Smoketm Benutzer

    Ja hab ich versucht nur wie kann ich mit count dann das minimum ermitteln? Also COUNT() im select Teil ist klar aber wie sieht dann der HAVING Teil aus bzw wie lässt sich damit dann das minimum ermitteln. Im Netz konnte ich dazu nichts finden.

    Code:
    SELECT COUNT(follows) as followercount, nickname
    FROM person, follows
    WHERE person.nickname = follows.followeenickname AND
    person.nickname LIKE %(pattern)s
    GROUP BY nickname
    HAVING ... wie gehts hier weiter?
     
  6. akretschmer

    akretschmer Datenbank-Guru

    sortieren und limit1 wäre die Holzhammermethode:

    Code:
    test=# create table x( t text);
    CREATE TABLE
    test=# insert into x select 'name ' || (random()*10)::int from generate_series(1,20) y;
    INSERT 0 20
    test=# select t, count(1) from x group by t order by count(1) desc limit 1;
      t  | count
    --------+-------
     name 1 |  3
    (1 row)
    
    test=# select * from x;
      t   
    ---------
     name 1
     name 3
     name 4
     name 10
     name 5
     name 4
     name 1
     name 8
     name 3
     name 8
     name 0
     name 0
     name 1
     name 6
     name 2
     name 4
     name 6
     name 5
     name 2
     name 5
    (20 rows)
    
    test=# select t, count(1) from x group by t order by count(1) desc;
      t  | count
    ---------+-------
     name 5  |  3
     name 1  |  3
     name 4  |  3
     name 6  |  2
     name 8  |  2
     name 2  |  2
     name 3  |  2
     name 0  |  2
     name 10 |  1
    (9 rows)
    
    test=#
    
    wie man sieht, ist das Ergebniss nicht ganz korrekt, weil name 5,1 und 4 jeweils 3 mal auftauchen. Will man das korrekt haben ginge:

    Code:
    test=# select * from (select t, rank() over (order by count(t) desc) from x group by t) foo where rank = 1;
      t  | rank
    --------+------
     name 5 |  1
     name 1 |  1
     name 4 |  1
    (3 rows)
    
    test=#
    
    Prost!
     
  7. Smoketm

    Smoketm Benutzer

    Ich versteh das nicht ich hab ja keine Zahlen zur Verfügung? Ich muss sozusagen erst die Follower ausfindig machen dann muss ich sie Zählen also über die Zeilen und dann muss ich herausfinden, ob die eben berechnete Zahl die kleinste ist? Aber wie das gehen sollte versteh ich einfach nicht. Vielen Dank für den Code, aber verstehen kann ich das nicht.
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Zählen kommt zwar von Zahlen, ist aber nicht auf diese beschränkt. Man kann auch Äpfel, Schweinehälften oder die Tage bis zum Urlaub zählen - in meinem Falle 2.
     
    Walter gefällt das.
  9. Smoketm

    Smoketm Benutzer

    Ich kann mir nicht vorstellen das ich es so lösen muss, da rank() noch gar nicht gemacht wurde. Ich denke es wird etwas anderes verlangt.Ich bin mir auch sicher das wir das schon ein mal gemacht haben, jedoch kann ich mich nur mehr erinnern das wir mit count() die Zeilen gezählt haben und dann mit min() das minimum ermittelt. So ungefähr zumindest.
    Also ich denke das ich mit meiner Anfrage am richtigen weg bin.
     
  10. akretschmer

    akretschmer Datenbank-Guru

    Bis wohin kommst Du denn? Dein "LIKE %(pattern)s" ist IMHO Murks. Vermutlich hast Du aber bereist eine Liste mit Namen, und willst wissen, welche Namen wie oft vorkommen bzw. welcher Name am seltesten vorkommt. Und auf diese Liste kannst Du ansetzen, so wie gezeigt.
     
  11. Smoketm

    Smoketm Benutzer

    Meine Anfrage jetzt:
    Code:
    SELECT COUNT(follows) as followercount, nickname
    FROM person, follows
    WHERE person.nickname = follows.followeenickname AND
    person.nickname LIKE %(pattern)s
    GROUP BY nickname
    Die Ausgabe:
    10 | Becktvik

    13 | BenBauer

    9 | Bearbugar

    7 | BelieveLuke

    Jetzt müsste ich irgendwie zu der 7 kommen da es ja die kleinste zahl ist und die anderen eliminieren.Mir ist gerade aufgefallen das wenn ich HAVING MIN(followercount) hinzufüge kommt folgender Fehler:

    psycopg2.ProgrammingError: column "followercount" does not exist
    LINE 6: HAVING MIN(followercount)
     
    Zuletzt bearbeitet: 21 Juni 2017
  12. akretschmer

    akretschmer Datenbank-Guru

    order by und limit sind nun Deine Freunde.
     
  13. Smoketm

    Smoketm Benutzer

    Habs hinbekommen komischerweise stimmt es bei der abgabe immer noch nicht ..... ich bin am verzweifeln....

    Query:
    Code:
    SELECT nickname, COUNT(follows) as followercount
    FROM person, follows
    WHERE person.nickname = follows.followeenickname AND
    person.nickname LIKE %(pattern)s
    GROUP BY nickname
    ORDER BY count(1) desc limit 1
    Ausgabe für zb Be%:

    BenBauer 13

    Fehlermeldung bei der Abgabe:
    Failed test for parameters: personpattern=Be%
    Traceback (most recent call last):
    File "./eval_milestone_5.py", line 88, in <module>
    student_result_tuples = execute_query(conn, query_string, qpdict)
    File "./eval_milestone_5.py", line 17, in execute_query
    cursor.execute(query_string, params)
    KeyError: 'pattern'
     
  14. akretschmer

    akretschmer Datenbank-Guru

    Ist das python? Das Pattern für LIKE muß eher so aussehen:

    Code:
    test=# select 'foo' like '%foo%';
     ?column?
    ----------
     t
    (1 row)
    
    Probier die Dinge bitte in psql aus, wenn das geht, dann in der Applikation.
     
  15. Smoketm

    Smoketm Benutzer

    Ja ist Python.Die Variable stimmt, jetzt bekomme ich diesen Fehler:

    Failed test for parameters: personpattern=%
    Value in column 0 of tuple 0 incorrect (starting with 0).

    Komischerweise laufen aber alle anderen Tests ohne Probleme durch? Eine Idee?


    LG
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden