Mysql Joins wenn mehr als 1 Wert mit Komma trennen

kosovafan

Erfahrenes Mitglied
Hallo,

ich habe hier von Mysql Joins gelesen und finde die einfach wunderbar. Das erleichtert vieles ungemein. Der geplante Abruf:

SQL:
SELECT
    p.products_id as ArtID,
    p.products_model as Artikelnummer,
    p.products_id as ArtID,
    p.products_ean as EAN,
    p.products_sort as "Master Sort",
    p.products_master_slave_order as "Int. Sort",
    d.products_name as Artikelname,
    d.products_short_description as Kurzbeschreibung,
    d.products_description as Beschreibung,
    CONCAT("https://localhost/",u.url_text) as url_text,
    FORMAT(p.products_vpe_value,0,'de_DE') as products_vpe_value,
    CONCAT(FORMAT(p.products_price,2)," EUR") as "VK Netto",
    FORMAT(p.products_weight,3) as Gewicht,
    p.products_shippingtime as Lieferzeit,
    CONCAT("https://localhost/media/images/info/",p.products_image) as Bild1,
    GROUP_CONCAT(c.categories_id ORDER by 'p.products_id' SEPARATOR ',') as Kategorie,
    p.products_status as Status,
    p.disabled_shippings as Spedition,
    d.products_keywords as "Keyword Suche",
    u.meta_title as "Meta Title 55-60",
    u.meta_description as "Meta Description 150"
FROM
    xt_products p
    left join xt_products_description d on p.products_id = d.products_id
    left join xt_products_to_categories c on p.products_id = c.products_id
    left join xt_seo_url u on p.products_id = u.link_id AND u.link_type = 1
GROUP BY p.products_id;

Hier geht es um "GROUP_CONCAT(c.categories_id ORDER by 'p.products_id' SEPARATOR ',') as Kategorie," der die IDs der Kategorien beheimat. Das können pro products_id auch einmal mehr als eine Nummer sein und hier wäre es super Mysql könnte die Nummern pro product_id getrennt durch Komma ausgeben. Diese SQL Abfrage gibt alle Kategorie ID im ersten Eintrag aus. Ohne Group etc. wird für jede KAT ID ein neue Zeile geschrieben.

Gäbe es auch die Möglichkeit das zum Beispiel die Kategorie Nummer 503 in einer anderen Tabelle nachgeschaut wird und anstatt der Nummer der entsprechende Name ausgegeben wird?

Danke für Eure Hilfe
Silvio
 

kosovafan

Erfahrenes Mitglied
Hallo,

das schwarz umrandete, alle Nummern im ersten Ergebnis, die sollten aber jeweils der product_id zugeordnet sein und wenn mehrere vorhanden sind dann mit Komma getrennt, oder halt getrennt, muss ja kein Komma sein :)

Sorry etwas zu erklären ist irgendwie nicht meine Stärke

Mfg & Danke
Silvio
 

Anhänge

  • Bildschirmfoto_2021-10-27_11-31-56.png
    Bildschirmfoto_2021-10-27_11-31-56.png
    310,7 KB · Aufrufe: 3

Zvoni

Erfahrenes Mitglied
Das habe ich schon verstanden (obwohl ich nicht verstehe, wieso du den GROUP_CONCAT nach products_id sortierst, da diese innerhalb des GROUP_CONCAT immer gleich ist).
Was ich nicht verstehe, ist was du ANSTATT haben willst.

Und übrigens: Wieso gibst du zweimal ArtID aus (erstes und drittes Feld)? Ist beide male dasselbe, und dann noch mit demselben Alias (was im Hintergrund dann wahrscheinlich eh umbenannt wird)
 

kosovafan

Erfahrenes Mitglied
Hallo,

das mit ArtId ist halt erst einmal ein Entwurf deshalb 2x. War Neugierde.

So ich hänge mal CSV Files an. xt_products ist der Ausgang, xt_products_to_categories sind die Kategorien. Es gibt für die products_id mehrere categories_id, weil Produkte manchmal in mehreren Kategorien passen.

Beispiel products_id 503 ist in categories_id 38, 589,39,586,41,42

Genau das ist es was ich möchte. products_id > Kategorie Nummern getrennt und nicht für jede Kategorie eine neue Zeile oder mit GROUP_CONCAT alles in Ergebnis 1 wie im Bild.

Group_CONCAT war ein Versuch > Google Suche.

Mfg & Danke
 

Anhänge

  • xt_products.csv
    76,9 KB · Aufrufe: 2
  • xt_products_to_categories.csv
    30,9 KB · Aufrufe: 2

Zvoni

Erfahrenes Mitglied
laut deiner CSV bekomme ich aber 56 Kategorien für products_ID 503

EDIT: Kann keinen Fehler an deiner Abfrage erkennen. GROUP_CONCAT ist richtig (ausser dem Murks mit dem ORDER BY).
Übrigens sortierst du nach dem Text "p.products_ID", nicht nach dem Feld

EDIT2: Mal zur Info für deine Beispieldaten:
Du hast 10786 products_ID in xt_products, aber nur für 584 products_ID hast du auch eine (oder mehrere) Kategorien in xt_products_to_categories
Heisst: für 10202 produkte hast du keine Kategorien hinterlegt
 
Zuletzt bearbeitet:

kosovafan

Erfahrenes Mitglied
Hallo,

ja ist völlig normal. Es werden nur Master in die Kategorien gepackt und das ist in der Tat korrekt. Also stimmt das in der Tat mit der Abfrage. Ich bin ein wenig ... naja. Ich verstehe jetzt nicht ganz was du

Übrigens sortierst du nach dem Text "p.products_ID", nicht nach dem Feld

damit meinst? GROUP BY im letzten Satz? Das ist das einzige was mir in der Tat alle Daten ausgibt, wenn ich zum Beispiel

SQL:
ORDER BY `p.products_id` ASC

nutze gibt es nur

Code:
#1054 - Unbekanntes Tabellenfeld 'p.products_id' in order clause

mit

SQL:
ORDER BY p.products_id ASC

erhalte ich nur ein Ergebnis.

Mfg & Danke
Silvio
 

Zvoni

Erfahrenes Mitglied
damit meinst? GROUP BY im letzten Satz? Das ist das einzige was mir in der Tat alle Daten ausgibt, wenn ich zum Beispiel

SQL:
ORDER BY `p.products_id` ASC
Das bezieht sich ausschliesslich auf dein GROUP_CONCAT (Zeile 17 in deinem ersten Post)
müsste mMn nach so lauten:
SQL:
/*blablablabla*/
GROUP_CONCAT(c.categories_id ORDER BY c.categories_ID SEPARATOR ',') as Kategorie,
/*blablablabla*/