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-Key: 472549

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

Printed on: April 23, 2024 at 06:04 o'clock

Member: ukulele-7
ukulele-7 Jul 12, 2019 updated at 15:14:24 (UTC)
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.
Member: HeadoN
HeadoN Jul 12, 2019 at 15:34:36 (UTC)
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)
Member: em-pie
em-pie Jul 12, 2019 at 15:46:45 (UTC)
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
Member: HeadoN
HeadoN Jul 12, 2019 at 16:19:52 (UTC)
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.
Member: em-pie
em-pie Jul 12, 2019 at 19:43:19 (UTC)
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?
Member: ukulele-7
ukulele-7 Jul 13, 2019 at 06:44:01 (UTC)
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?
Member: HeadoN
HeadoN Jul 15, 2019 at 09:32:03 (UTC)
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
Member: em-pie
em-pie Jul 15, 2019 at 20:18:55 (UTC)
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
Member: HeadoN
HeadoN Jul 16, 2019 at 10:24:43 (UTC)
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
Mitglied: 140447
Solution 140447 Jul 16, 2019 updated at 12:04:34 (UTC)
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ß
Member: HeadoN
HeadoN Jul 16, 2019 at 12:48:20 (UTC)
Goto Top
Vielen vielen Dank das war es. Musste es noch ein klein bisschen anpassen aber jetzt funktioniert es perfekt.
Mitglied: 140447
140447 Jul 16, 2019 at 13:08:38 (UTC)
Goto Top
Bitte.