select wenn PK varchar Feld ist

Hallo Zusammen,

ich habe eine DB übernommen, bei der ich einige Anpassungen vornehmen soll.
Was habe ich:
User Tabelle, in der der PK varchar.
Rundgangstabelle PK serial.
Verknüpfungstabelle: varchar,integer

Die Aufgabe besteht nun darin für die User die Rundgänge zu erzeugen ( Anzahl Rundgänge ( ca. 15) < Useranzahl (>100) )

Die eine Seite ist klar - Anzahl der Rundgänge aus Rundgangstabelle holen, dann die Anzahl als LIMIT für die Userabfrage verwenden
Hier habe ich 2 Probleme

  1. Wie kann ich zB. 15 User aus der Tabelle auslesen und dabei die User nach Alphabet auswählen ?
  2. Wie kann ich wieder von vorne in der Usertabelle weitermachen, wenn ich zB. 10 Rundgänge erzeugt habe und wieder bei user A*** anfangen muss

ich würde gern helfen, versteh aber das Problem nicht. Sorry.

OK zum verdeutlichen
Usertabelle
login(text/PK) | username |…


anders.a | Andreas Anders
brecht.b | Bert Brecht
hecht.h | Herbert Hecht
maier.m | Michael Maier
wolf.w | Walter Wolf

Rundgangstabelle
rrowid(serial) | Rundgang


1 | Rundgang 1
2 | Rundgang 2
3 | Rundgang 3

Damit habe ich 3 Rundgänge zur Verfügung
Bei zwei Durchläufen soll meine Verknüpfungstabelle so aussehen:


anders.a | 1
brecht.b | 2
hecht.h | 3
maier.m | 1
wolf.w | 2
anders.a | 3

Vielleicht so:

test=*# create table namen ( name text);
CREATE TABLE
Time: 404,353 ms
test=*# copy namen from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> andreas
>> max
>> heinz
>> steffi
>> udo
>> anne
>> tamara
>> gabi
>> uwe
>> \.
Time: 31917,932 ms
test=*# create sequence namen_seq maxvalue 3 cycle;
CREATE SEQUENCE
Time: 0,899 ms
test=*# select name, nextval('namen_seq') from namen;
  name   | nextval
---------+---------
 andreas |       1
 max     |       2
 heinz   |       3
 steffi  |       1
 udo     |       2
 anne    |       3
 tamara  |       1
 gabi    |       2
 uwe     |       3
(9 rows)

Ich seh aber schon, du willst wieder von vorne anfangen bis jeder 2 mal durch ist. Fällt mit jetzt grad keine ad-hoc - Lösung ein außer man schreibt sich eine kleine Funktion dafür.

Nicht nur 2 mal, das Ding soll die nächsten Jahre so laufen.
Wie gesagt, im Moment gibt es ca. 15 Rundgänge, die von einer Gruppe von ca. 100 Usern 1x die Woche durchgeführt werden muss.
dh. ca. 60 Rundgänge pro Monat



select name, nextval('namen_seq') from (select name from namen union all select name from namen) bla;

Für 2 Durchgänge. Die Anzahl der Durchgänge via Funktion variabel zu gestalten (innerhalb der Funktion dann N mal UNION ALL machen) überlasse ich Dir zur Übung :wink:

ok das würde dann wohl heißen, dass ich die Anzahl der Rundgänge auslesen muss, diese als maxvalue an die sequence übergebe, und da die Rundgänge alle 4 Wochen erzeugt werden vor Aufruf meiner Funktion die Sequence lösche, bzw. ändere da sich in der Zeit die Anzahl der Rundgänge ändern könnte.
Was ich da jetzt nicht hinbekomme, wahrscheinlich wieder mal eine Syntaxproblematik:
create sequence namen_seq maxvalue ( select count(rowid) from tours ) cycle;

Ja, das geht so wohl nicht. Erstelle das dynamisch (in einer Funktion) als String und EXECUTE den dann.

Andreas,
kannst Du mir da etwas auf die Sprünge helfen ?
Funktionen brauchte ich seither noch nicht, oder aber ich wußte es einfach nicht besser !



test=# create or replace function create_seq(int) returns bool as $$ begin execute 'create sequence seq_bla maxvalue ' || $1::text || ' cycle'; return true; end; $$ language plpgsql;
CREATE FUNCTION
Time: 0,361 ms
test=*# select create_seq(27);
 create_seq
------------
 t
(1 row)

Time: 29,626 ms
test=*# select * from seq_bla;
 sequence_name | last_value | start_value | increment_by | max_value | min_value | cache_value | log_cnt | is_cycled | is_called
---------------+------------+-------------+--------------+-----------+-----------+-------------+---------+-----------+-----------
 seq_bla       |          1 |           1 |            1 |        27 |         1 |           1 |       0 | t         | f
(1 row)

Andreas