Maresa: Abfrage von Daten mit Primärschlüssel aus Spalte

Hallo,

ich habe eine MySql Datenbank mit einer Tabelle USER mit der Spalte "berechtigung". In berechtigung stehen Primärschlüssel einer anderen Tabelle PROJEKTE, per Komma getrennt, drin.

Ich möchte nun alle Daten aus "projekte abfragen" bei welchem der Primärschlüssel mit den Werten aus "berechtigung" übereinstimmt.

Bspl.

Tabelle USER

nachname | berechtigung
------------------------
müller    1,3
schwarz   2,4,5

Tabelle PROJEKTE

id | projektname
-----------------
1    projekt1
2    projekt2
3    projekt3
4    projekt4
5    projekt5
6    projekt6

Wie kann ich nun die Abfrage gestalten? Erstmal muss ich die Daten aus "berechtigung" ja irgendwie trennen. Ich dachte mir, in ein Array einlesen.
Wie frage ich aber nun in einer SQL Abfrage alle Datensätze ab, die den Primärschlüsseln entsprechen?

Wie würdet Ihr das lösen?

Vielen Dank

Maresa

  1. Wie würdet Ihr das lösen?

    Also ich würde eine weitere Tabelle einführen, da das so ein schlechtes Datenbank Modell ist.

    BERECHTIGUNG
    USER   | PROJEKT_ID
    müller   3
    müller   1
    schwarz  2
    schwarz  4
    schwarz  5

    und dann mit

    SELECT P.PROJEKTNAME FROM PROJEKTE P, USER U, BERECHTIGUNG B WHERE P.ID=B.PROJEKT_ID AND B.USER = U.nachname

    alle Projekte holen, die zu den entsprechenden Berechtigungen gehören

    MfG
    Jonas Tampier

    1. Hallo,

      vielen Dank! Ich hab die Tabellen nun so angelegt.
      Mit der SQL Abfrage komme ich aber nicht zurecht...

      SELECT P.PROJEKTNAME FROM PROJEKTE P, USER U, BERECHTIGUNG B WHERE P.ID=B.PROJEKT_ID AND B.USER = U.nachname

      Was bedeutet das P. und P und U und B ?

      Ich hab eine Tabelle angelegt, welche berechtigungen heisst -> sie hat 2 Spalten "user" und "projekte" in der jeweils die IDs aus den Tabellen der User Übersicht und der Projektübersicht gepseichert werden sollen.

      Wie bekomme ich nun den Namen der Projekte eines Users?

      Vielen Dank

      Maresa

      1. SELECT P.PROJEKTNAME FROM PROJEKTE P, USER U, BERECHTIGUNG B WHERE P.ID=B.PROJEKT_ID AND B.USER = U.nachname
        Was bedeutet das P. und P und U und B ?

        Das sind Aliasnamen, damit ich die Tabellennamen nicht immer ausschreiben muss :)

        Wie bekomme ich nun den Namen der Projekte eines Users?

        Das sollte der select eigentlich bewerkstelligen

        1. SELECT P.PROJEKTNAME FROM PROJEKTE P, USER U, BERECHTIGUNG B WHERE P.ID=B.PROJEKT_ID AND B.USER = U.nachname

          Wie bekomme ich nun den Namen der Projekte eines Users?
          Das sollte der select eigentlich bewerkstelligen

          hmm.. irgendwie bekomme ich die sql abfrage nicht auf die reihe.

          es kommt immer die fehermeldung "Unknown column 'projekte' in 'field list'"

          ich hab nun eine tabelle berechtigunen mit 2 spalten erstellt: user_id und projekt_id

          ausserdem gibt es die tabelle projekte mit projektID und projektname

          die ID des users kommt aus einer session: $HTTP_SESSION_VARS["userID"]

          kannst du mir nochmals helfen?

          1. Hallo Maresa,

            wenn Du folgende Tabellen hast:

            table a(id int, name varchar(20));
            VALUES (1 , 'Mueller');
            VALUES (2 , 'Schaefer');

            table b(id int, projekt varchar(20));
            VALUES (1 , 'HTML');
            VALUES (2 , 'PHP');

            table c(id_a int, id_b int));
            VALUES (1 , 1);
            VALUES (1 , 2);

            dann probier mal eine anweisung wie diese:
            select projekt from a,b,c where b.id=c.id_b and a.name = 'Mueller';
            das sollte herauskommen:
            +---------+
            | projekt |
            +---------+
            | HTML    |
            | PHP     |
            +---------+

            1. Hallo Maresa,
              sorry, war nur die halbe Wahrheit:

              select projekt from a,b,c where a.name = 'Mueller' and  b.id=c.id_b and a.id = c.id_a;

              das sollte aber nun das erwünschte Ergebnis bringen

              Gruss
              annA

  2. Hallo Maresa,

    falls Du die Struktur der Datenbank noch ändern kannst, Du dies.
    Hierfür solltest Du Dich ein bisschen mit Datenbankstrukturen
    beschäftigen. Stichwort: Normalisierung von Datenbanken/Tabellen.

    In der Regel würde man solch eine Datenbank wie Du sie beschreibst so aufbauen:

    id | nachname
    1  | müller
    2  | schwarz

    id | projektname
    -----------------
    1    projekt1
    2    projekt2
    3    projekt3
    4    projekt4
    5    projekt5
    6    projekt6

    koppeltabelle:
    id_nachname | id_projekt
    1           | 1
    1           | 3
    2           | 2
    2           | 4
    2           | 5

    Diese Art der Umsetzung kostet zwar mehr Speicher und auch die
    Selects werden komplexer, es ist aber leichter zu warten, leichter
    erweiterbar etc.

    Viele Grüße
    annA