headon
Goto Top

Hilfe bei SQL Inner Join bzw group by

Hallo ich brauche mal eure Hilfe da meine SQL Zeit doch sehr lange her ist. Ich glaube ich brauche Inner Join und Group by

Ich habe eine Tabelle in der stehen verschiedene Wert. Eine Spalte mit einem Bildpfad welcher öfters vorkommt. Eine Spalte mit einem Variablen Namen welcher auch öfters vorkommt aber immer nur 1x zu jedem Bildpfad und eine Lösungsspalte. Jetzt kann ich mit select bild, Lösung from tabelle where bild like '%xx1%' and variable 'xx1' mir zwar immer das Ergebnis für eine bestimmte Variable anzeigen lassen aber ich möchte das vereinfachen in dem ich mir zu dem Bild zum Beispiel variable xx1 bis xx5 anzeigen lasse bzw reichen mir die Lösungen.

Content-ID: 472549

Url: https://administrator.de/contentid/472549

Ausgedruckt am: 22.11.2024 um 06:11 Uhr

ukulele-7
ukulele-7 12.07.2019 aktualisiert um 17:14:24 Uhr
Goto Top
Nach drei mal lesen checke ichs noch nicht. Also 3 Spalten: Bildpfad, Variabler_Name und Bild, was genau verstehst du unter einer "Lösungsspalte"? Willst du etwas aggregieren? Wiso suchst du mit WHERE nach Bild und gruppierst nicht nach Bildpfad?

SELECT bildpfad, variabler_name, bild, aggregat
FROM tabelle
GROUP BY bildpfad, variabler_name, bild

Einen INNER JOIN brauchst du frühestens wenn du mehr als eine Tabelle hast, davon steht da aber nix.
HeadoN
HeadoN 12.07.2019 um 17:34:36 Uhr
Goto Top
Ok dann versuche ich es mal anders zu formulieren.

Ich habe

Bild	item_id	Loesung_1
1102110501.png	VL03102a	1
1102110503.png	VL03102a	1
1102110505.png	VL03102a	1
1102110507.png	VL03102a	100
1102110509.png	VL03102a	100
1102110511.png	VL03102a	1
1102110513.png	VL03102a	1
1102110515.png	VL03102a	1
1102110517.png	VL03102a	1
1104120501.png	VL03102a	99

1102110501.png	VL03102b	1
1102110503.png	VL03102b	1
1102110505.png	VL03102b	1
1102110507.png	VL03102b	100
1102110509.png	VL03102b	100
1102110511.png	VL03102b	1
1102110513.png	VL03102b	1
1102110515.png	VL03102b	1
1102110517.png	VL03102b	1
1104120501.png	VL03102b	99

Ich möchte mir nun anzeigen lassen zum Beispiel die Loesung 1 von Bild like %211% and (item_id = 'VL03102a' or item_id='VL03102b')

Am besten in der Form

Bild Lösung1(VL03102a) Lösung2(VL03102b)
em-pie
em-pie 12.07.2019 um 17:46:45 Uhr
Goto Top
Moin,

dann wäre es mit einem Join doch möglich.
Ich gehe mal davon aus, dass das Bild der "Schlüssel" ist, dann kannst du die Tabelle mit sich selbst joinen:
Select 
  a.Bild
  , a.item_id as L1
  , b.item_id as L2
From
   YourTable as a
Full Outer Join 
   YourTable as b on a.Bild = b.Bild
where
   Bild like '%211%'  

Hinweis zum Full Outer Join:
https://www.w3schools.com/sql/sql_join_full.asp

Gruß
em-pie
HeadoN
HeadoN 12.07.2019 um 18:19:52 Uhr
Goto Top
Nein Bild ist leider kein PrimaryKey dazu gibt es noch eine ID. Bild kann wie gesagt mehrfach vorkommen aber dann halt immer mit einer anderen item_id.

Der Code spuckt bei mir eine Fehlermeldung.
em-pie
em-pie 12.07.2019 um 21:43:19 Uhr
Goto Top
Ich sprach ja auch nicht vom Primarkey.
Das Bild wäre für den Join der gemeinsame Nenner, über den du ja die Item_id erhalten willst... so habe ich es jedenfalls verstanden...

Welchen Fehler erhältst du denn?
ukulele-7
ukulele-7 13.07.2019 um 08:44:01 Uhr
Goto Top
Bild ist in jedem Fall die Spalte anhand derer du das ganze zusammen fassen willst. Ich vermute das kommt aber erst durch ein schlechtes Design zustande, also eigentlich ist warscheinlich item_id mehrteilig, ein Teil haben alle Bilder gemeinsam und ein Teil identifiziert die verschiedenen Einträge mit dem selben Bild. In deinem Beispiel wäre das VL03102 als gemeinsammer Nenner und a,b als "VersionsID" des Bildes.

Wenn dem so ist und diese Struktur immer feste Gemeinsamkeiten hat dann könnte man diese Spalte zerlegen und den ersten Teil als Gemeinsamkeit nehmen. Dazu kennen wir die Entstehung der Werte in dieser Spalte aber nicht ausreichend, wird da immer genau maximal ein Buchstabe angehängt und gibt es auch Einträge ohne Buchstaben?

In jedem Fall ließe sich anhand dieser Spalte oder ersatzweise Bild gruppieren oder Joinen. Ich vermute immernoch du willst gruppieren aber dazu müssen wir deine Spalte Lösung und ihre Bedeutung verstehen. Ist das eine Zeichenkette oder ließe sich das anders irgendwie zusammen fassen? Was ist dein Wunschergebnis zu den oben gezeigten Datensätzen?

Und bitte immer Fehlermeldungen posten face-smile Um welches SQL handelt es sich?
HeadoN
HeadoN 15.07.2019 um 11:32:03 Uhr
Goto Top
Ja die Datenbank ist leider sehr schlecht aufgebaut, leider musste ich die für das Projekt so erstmal von meinem Vorgänger übernehmen.

Kurz noch mal erklärt wo was gespeichert wird.

In dieser Tabelle sind Bilder von allen Seiten verschiedener Hefte drin die verschiedene Benutzer ausgefüllt haben. Jetzt ist es so das auf Seite 12 von Heft 5 eine Variable steht und in der Datenbank sind dann bei 100 Leuten die das ausgefüllt haben 100 Datensätze drin mit der Lösung. Nun ist es aber so das auf einer Seite nicht nur eine Variable vorkommt sondern auch mal 7 verschiedene.

Ich möchte mir dann halt alle Variablen und die Lösungen Anzeigen lassen die auf dieser Seite sind. Jetzt kann ich über ein like sagen er soll mir alle bilder raussuchen die in Heft 5 Seite 12 sind, allerdings bekomme ich dann die Variablen untereinander angezeigt (als einzelne Datensätze) aber das möchte ich gerne gruppiert haben.

bisher benutze ich immer folgende where klausel: bild like '%Heft12%' and item-id='va001'

nicht alle variablen sind gleich aufgebaut manchmal ist nur ein buchstabe am anfang mal mehrere
db abfrage
em-pie
em-pie 15.07.2019 um 22:18:55 Uhr
Goto Top
Tja,

Das Full Outer Join kann MySQL nicht. Bin von MS SQL ausgegangen.

Aber der Fehler sagt es dir doch: „in der Nähe von Full Outer Join gibt es einen Fehler“

Schaue einmal hier
https://www.peterkropff.de/site/mysql/full_outer_join.htm


Gruß
em-pie
HeadoN
HeadoN 16.07.2019 um 12:24:43 Uhr
Goto Top
Hi em-pie,

sry aber ich bekomms nicht hin. Habe Joins schon damals in der Ausbildung gehasst. Dein Beispiel geht auch von 2 Tabellen aus, habe versucht es auf eine umzuschreiben aber irgendwie klappt das nicht face-sad
140447
Lösung 140447 16.07.2019 aktualisiert um 14:04:34 Uhr
Goto Top
Moin @HeadoN .
Hier mal schnell durchgespielt:

Exemplarische Tabelle :
screenshot

Dann folgendes SQL in MySQL Workbench ausgeführt:
SET @sql = NULL;
set @filter = '%0122%';  
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(IF(item_id = ''',  
      item_id,
      ''', lösung, NULL)) AS ''Lösung(',  
      item_id,
      ')'''  
    )
  ) INTO @sql
FROM daten
WHERE bild like @filter;

SET @sql = CONCAT('SELECT bild, ', @sql, ' FROM daten WHERE bild like ''',@filter,''' GROUP BY bild');  
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Und folgendes Ergebnis erhalten:

screenshot

Dabei ist es egal wie viele item_id's zum entsprechenden Bild existieren, diese werden ermittelt und die entsprechenden Spalten generiert.

Lesenswert dazu :Dynamic pivot tables (transform rows to columns)

Ciao.
Gruß
HeadoN
HeadoN 16.07.2019 um 14:48:20 Uhr
Goto Top
Vielen vielen Dank das war es. Musste es noch ein klein bisschen anpassen aber jetzt funktioniert es perfekt.
140447
140447 16.07.2019 um 15:08:38 Uhr
Goto Top
Bitte.