Mysql Ausgabe der Spaltentitel, welche gleichen Inhalt haben

vodanet

Benutzer
Beiträge
18
Hallo,
ich habe eine Mysql Tabelle mit
id, aufgabe1, aufgabe2, aufgabe3, etc...

Inhalt könnte so aussehen:

idaufgabe1aufgabe2aufgabe3aufgabe4
290879066
30909073

Ich möchte nun durch ein Select auf eine ID die Feldnamen, welche den gleichen Inhalt haben. Das wäre:

bei id 2: aufgabe1 und aufgabe 3
bei id 3: aufgabe2 und aufgabe 3

Wie müsste die Abfrage aussehen?
Ich hoffe ihr versteht, was ich meine und könnt mir weiterhelfen.


Vielen Dank schon mal
Daniel
 
Werbung:
Durchnummerierte Spalten sind (fast) immer ein Zeichen für kapottes Tabellendesign. Was machst Du, wenn Aufgabe42 dazukommt?

Du solltest das also eher so aufbauen:

Code:
postgres=# \d vodanet
                         Table "public.vodanet"
 Column |  Type   | Collation | Nullable |           Default           
--------+---------+-----------+----------+------------------------------
 id     | integer |           | not null | generated always as identity
 i      | integer |           |          |
 a      | integer |           |          |
Indexes:
    "vodanet_pkey" PRIMARY KEY, btree (id)

postgres=# select * from vodanet;
 id | i | a 
----+---+----
  1 | 2 | 90
  2 | 2 | 87
  3 | 2 | 90
  4 | 2 | 66
  5 | 3 |  0
  6 | 3 | 90
  7 | 3 | 90
  8 | 3 | 73
(8 rows)

postgres=#

Abfrage wäre dann z.B.:

Code:
postgres=# with foo as (select i, a, count(1) from vodanet group by i,a having count(1) > 1) select * from vodanet where (i,a) in (select i,a from foo);
 id | i | a 
----+---+----
  1 | 2 | 90
  3 | 2 | 90
  6 | 3 | 90
  7 | 3 | 90
(4 rows)


-- oder

postgres=# with foo as (select i, a, count(1) from vodanet group by i,a having count(1) > 1) select i, array_agg(a) from vodanet where (i,a) in (select i,a from foo) group by i;
 i | array_agg
---+-----------
 2 | {90,90}
 3 | {90,90}
(2 rows)
 
Es kann sein, dass unterschiedlich viele Aufgaben gleiche Werte haben.
Die Werte sind id's einer User-Tabelle.
Es kommen für dieses Szenario sehr unwahrscheinlich weitere Aufgaben dazu. Ansonsten wäre eine bessere Struktur natürlich wirklich notwendig.
Vielen Dank schon mal für eure bisherigen Tipps!
:)
 
okay, aber nur weil Du es bist:

Code:
postgres=# select * from vodanet2;
 id | a1 | a2 | a3 | a4 
----+----+----+----+----
  2 | 90 | 87 | 90 | 66
  3 |  0 | 90 | 90 | 73
(2 rows)

postgres=# with foo as (select id, unnest(array[a1,a2,a3,a4]) from vodanet2) select id, unnest, count(unnest) from foo group by id, unnest having count(unnest) > 1;
 id | unnest | count 
----+--------+-------
  3 |     90 |     2
  2 |     90 |     2
(2 rows)

postgres=#

Ist jetzt aber, ähm, nicht MySQL ...
 
Hallo,
leider komme ich erst jetzt zum Antworten.
Ich habe es leider nicht auf mysql umgemünzt bekommen. :(

Mein Ansatz ist nun folgender:
SQL:
SELECT a.id, a.aufgabe1, a.aufgabe2, a.aufgabe3
FROM aufgaben a
INNER JOIN aufgaben b
ON a.aufgabe1=b.aufgabe2
OR a.aufgabe1=b.aufgabe3
WHERE a.id = b.id AND a.id = 2
ORDER BY `a`.`id` ASC

Das geht soweit.
Ich erhalte nur eine Ausgabe, wenn es doppelte Einträge gibt.
Wie kann ich nun nur die Spalten ausgeben lassen, welche auch den doppelten Wert enthalten?
Um bei diesem Beispiel zu bleiben:
Code:
 id | a1 | a2 | a3 | a4
----+----+----+----+----
  2 | 90 | 87 | 90 | 66
  3 |  0 | 90 | 90 | 73

Wie erhalte ich für
Code:
id 2
als Ausgabe NUR die Spalten a1 und a3?
Es handelt sich im Prinzip um einen Planer für einzelne Aufgaben. Der Benutzer soll informiert werden, wenn eine id (ein User) bei mehreren Aufgaben eingetragen ist.
Vieleicht ist ja mein ganzer Ansatz diesbezüglich falsch. 🤔
 
Nun ja, SQL erlaubt es nicht, je nach Ergebnis verschiedene Spalten auszugeben.
Mir ist auch nicht klar, was es bringen sollte, wenn da 1, 2, 3 oder 4 Spalten stehen mit identischem Inhalt.
Wenn Du soetwas haben möchtest, musst als Ergebnis eine Spalte produzieren, deren Inhalt dann die gewünschten Werte anzeigt. (auch nicht ergiebiger, aber SQL konform.

Vieleicht ist ja mein ganzer Ansatz diesbezüglich falsch. 🤔
 
Nun ja, SQL erlaubt es nicht, je nach Ergebnis verschiedene Spalten auszugeben.
Mir ist auch nicht klar, was es bringen sollte, wenn da 1, 2, 3 oder 4 Spalten stehen mit identischem Inhalt.
Wenn Du soetwas haben möchtest, musst als Ergebnis eine Spalte produzieren, deren Inhalt dann die gewünschten Werte anzeigt. (auch nicht ergiebiger, aber SQL konform.
Naja, mit etwas guten Willen gehts doch:

Code:
SELECT CONCAT('Bei id', id ,': ',GROUP_CONCAT(label SEPARATOR ' und ' ), ' mit UserID : ',an)
FROM (
  (select id,'aufgabe1' AS label ,a1 AS an from aufgaben)
  UNION ALL
  (select id,'aufgabe2' AS label ,a2 AS an from aufgaben)
  UNION ALL
  (select id,'aufgabe3' AS label ,a3 AS an from aufgaben)
  UNION ALL
  (select id,'aufgabe4' AS label ,a4 AS an from aufgaben)
) AS aufg
GROUP BY id, an
HAVING count(*) > 1
ORDER by id;

Hier ein Beispiel:

Die Tabelle:
Code:
mysql> SELECT * FROM aufgaben;
+----+------+------+------+------+
| id | a1   | a2   | a3   | a4   |
+----+------+------+------+------+
|  1 |   90 |   87 |   90 |   66 |
|  2 |    0 |   90 |   90 |   73 |
|  3 |   55 |   55 |   90 |   55 |
|  4 |   13 |   13 |   13 |   13 |
|  5 |   13 |   14 |   25 |   25 |
+----+------+------+------+------+
5 rows in set (0.01 sec)

Das Ergebnis:
Code:
mysql> SELECT CONCAT('Bei id', id ,': ',GROUP_CONCAT(label SEPARATOR ' und ' ), ' mit UserID : ',an)
    -> FROM (
    ->   (select id,'aufgabe1' AS label ,a1 AS an from aufgaben)
    ->   UNION ALL
    ->   (select id,'aufgabe2' AS label ,a2 AS an from aufgaben)
    ->   UNION ALL
    ->   (select id,'aufgabe3' AS label ,a3 AS an from aufgaben)
    ->   UNION ALL
    ->   (select id,'aufgabe4' AS label ,a4 AS an from aufgaben)
    -> ) AS aufg
    -> GROUP BY id, an
    -> HAVING count(*) > 1
    -> ORDER by id;
+----------------------------------------------------------------------------------------+
| CONCAT('Bei id', id ,': ',GROUP_CONCAT(label SEPARATOR ' und ' ), ' mit UserID : ',an) |
+----------------------------------------------------------------------------------------+
| Bei id1: aufgabe1 und aufgabe3 mit UserID : 90                                         |
| Bei id2: aufgabe2 und aufgabe3 mit UserID : 90                                         |
| Bei id3: aufgabe2 und aufgabe1 und aufgabe4 mit UserID : 55                            |
| Bei id4: aufgabe2 und aufgabe1 und aufgabe3 und aufgabe4 mit UserID : 13               |
| Bei id5: aufgabe3 und aufgabe4 mit UserID : 25                                         |
+----------------------------------------------------------------------------------------+
5 rows in set (0.02 sec)

mysql>

Gruß Bernd
 
Und wenn du das GROUP_CONCAT so abänderst

Code:
GROUP_CONCAT(label ORDER BY label SEPARATOR ' und ' )

stimmt auch die Reihenfolge bei id 3 :)
 
Werbung:
Das ist das, wonach ich gesucht habe. 👍🙂
Ich habe vor vielen Jahren mit dieser Datenbank angefangen. Mit der Zeit ist es immer mehr gewachsen und die Struktur ist durch Unwissen meinerseits oftmals "nicht die Beste" . Heute würde ich das wohl auch anders machen. 😑
Aber danke an euch, dass ihr mir (wieder mal) eine Lösung für meine Frage geliefert habt.
VG Daniel 👋
 
Zurück
Oben