Pit: SQL: Mehrere User zu einer ID abfragen

Hallo,

ich habe eine Tabelle, die die Grunddaten eines Vorgangs enthält.

V_ID,Spalte1,Spalte2, usw.

Und ich habe eine 2. Tabelle, die User enthält.

U_ID,Spalte1,Spalte2, usw.

Und ich habe eine Beziehungstabelle, die die teilnehmenden User an den Vorgängen enthält.

Bez_ID,U_ID,V_ID

Normalerweise frage ich die über einen JOIN ab, das ist auch nicht das Problem. Ich benötige für genau eine Anwendung eine Abfrage, die es schafft, mir je Vorgang eine Tabellenzeile in der Ergebnismenge zu generieren, die die User beliebigstring-separiert darstellt.

Bsp.:

V_ID, Spalte1, Spalte2, ..., 2||4||7||12, Spalte_n

Geht sowas??

Pit

  1. Tach!

    Ich benötige für genau eine Anwendung eine Abfrage, die es schafft, mir je Vorgang eine Tabellenzeile in der Ergebnismenge zu generieren, die die User beliebigstring-separiert darstellt.

    Warum auch immer, du das brauchst, aber GROUP_CONCAT() kann das - wenn es sich um MySQL handelt. Wenn es nicht MySQL ist, dann findest du mit dem Stichwort und dem Namen deines DBMS sicher eine Lösungsmöglichkeit.

    dedlfix.

    1. Hi dedlfix und "frohes Neues",

      Warum auch immer, du das brauchst, aber GROUP_CONCAT() kann das - wenn es sich um MySQL handelt. Wenn es nicht MySQL ist, dann findest du mit dem Stichwort und dem Namen deines DBMS sicher eine Lösungsmöglichkeit.

      Ist mysql. Und die Funktion selber ist spitze.

      Leider bleibt ein Problem übrig. Wenn ich abfrage:

      SELECT
      v.V_ID,
      u.U_ID,
      ...
      GROUP_CONCAT(u.U_ID) AS Test
      usw.
      

      dann erhalte ich bei 2 Usern nur noch eine Zeile.

      Ich bräuchte aber beide Zeilen, nur das eben in der Spalte "Test" jeweils beide User_IDs drin stehen (kommasepariert passt schon...).

      Geht das auch?

      Pit

      1. Tach!

        Wenn ich abfrage:

        SELECT
        v.V_ID,
        u.U_ID,
        ...
        GROUP_CONCAT(u.U_ID) AS Test
        usw.
        

        dann erhalte ich bei 2 Usern nur noch eine Zeile.

        Ich bräuchte aber beide Zeilen, nur das eben in der Spalte "Test" jeweils beide User_IDs drin stehen (kommasepariert passt schon...).

        Geht das auch?

        Ja, wenn du die GROUP_CONCAT()-Abfrage als Subquery einbindest. Aber schön sieht vermutlich eine ganz andere Lösung des eigentlichen Problems aus.

        dedlfix.

        1. Ja, wenn du die GROUP_CONCAT()-Abfrage als Subquery einbindest. Aber schön sieht vermutlich eine ganz andere Lösung des eigentlichen Problems aus.

          Es geht darum, ich habe eine perfekte Query, die mir aber leider nur 1 User je Vorgang anzeigt, auch wenn 2 User dort über die Beziehungstabelle eingetragen sind. Eine ähnliche Beziehungstabelle zu den Vorgängen gibt es in der Instrumententabelle. Auch hier bekomme ich nur 1 instrument angezeigt.

          Ich würde die vorhandene (perfekte) Query gerne durch 2 Einträge erweitern:

          1. GROUP_CONCAT() bezogen auf die UserID (bzw. UserName)
          2. GROUP_CONCAT() bezogen auf die InstrumentenID (bzw. InstrumentenName)

          Dann könnte ich bei meinem Mouseover über den Vorgang nicht nur 1 Instrument und 1 User, sondern alle Instrumente und alle User anzeigen.

          Dafür müsste aber die Originalquery in der Ergebnismenge unverändert bleiben, nur eben ergänzt durch diese beiden Spalten, die die (von mir aus) kommaseparierte Einträge enthalten.

          Schaffe ich leider derzeit mit Deinen Tips noch nicht.

          Pit

        2. Hi dedlfix,

          Wenn ich abfrage:

          SELECT
          v.V_ID,
          u.U_ID,
          ...
          GROUP_CONCAT(u.U_ID) AS Test
          usw.
          

          dann erhalte ich bei 2 Usern nur noch eine Zeile.

          Ich bräuchte aber beide Zeilen, nur das eben in der Spalte "Test" jeweils beide User_IDs drin stehen (kommasepariert passt schon...).

          Geht das auch?

          Ja, wenn du die GROUP_CONCAT()-Abfrage als Subquery einbindest. Aber schön sieht vermutlich eine ganz andere Lösung des eigentlichen Problems aus.

          Habe ich nach etlichen Stunden nun auch hinbekommen. Funktioniert. ABER leider nur solange, wie ich lediglich einen einzigen Vorgang habe. Nun lasse ich mir aber im Gesamtergebnis z.b 20 Vorgänge anzeigen und schon würden die beiden Subqueries mehr als 1 ergebniszeile produzieren. Und das wars dann auch schon.

          Gibt es eine Chance, die Subqueries an die jeweiligen IDs zu binden?

          Ansonsten bliebe ja nur noch die Möglichkeite, die Subqueries in die Ergebnisschleife einzubinden und das wären dann anstelle 1 Query z.b 21 Queries.

          Pit

          1. Tach!

            Gibt es eine Chance, die Subqueries an die jeweiligen IDs zu binden?

            Ja, correlated Subquery nennt sich das. Man kann sich innerhalb der Subquery auf Dinge der äußeren beziehen, mit Alias oder Tabellennamen vor dem Feldnamen.

            dedlfix.

            1. Hi dedlfix,

              Ja, correlated Subquery nennt sich das. Man kann sich innerhalb der Subquery auf Dinge der äußeren beziehen, mit Alias oder Tabellennamen vor dem Feldnamen.

              Ah, fantastisch.

              Da spar ich wirklich viele Queries durch.

              Danke @dedlfix,

              Pit