Minimum herausfinden

Smoketm

Benutzer
Beiträge
13
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
 
Werbung:
Fehlermeldung nicht aber min(followeenickname) gibt mir Namen und keine Zahl,wobei ich eine Zahl brauche, da eben das Minimum ausgegeben werden soll.
 
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?
 
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!
 
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.
 
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.
 
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.
 
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:
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'
 
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.
 
Werbung:
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
 
Zurück
Oben