Modulshop - Eine große Auswahl an neuen und hilfreichen Modulen für die modified eCommerce Shopsoftware
Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: SQL-Abfrage - Spalte 1 in Abhängigkeit zu Spalte 2 per Select auswerten?

    0815

    • Viel Schreiber
    • Beiträge: 905
    Moin,

    wie kann ich denn bei dieser Select-Abfrage ...
    Code: PHP  [Auswählen]
     $manufacturers_query = xtDBquery("
      select distinct
        m.manufacturers_id,
        m.manufacturers_name,
        m.manufacturers_image
      from  "
    .TABLE_MANUFACTURERS." m,
        "
    .TABLE_PRODUCTS." p,
        "
    .TABLE_PRODUCTS_TO_CATEGORIES." p2c
      where  m.manufacturers_id = p.manufacturers_id
      and  p.products_status = 1
      and     p.products_id = p2c.products_id
      and     p2c.categories_id BETWEEN '"
    .$c_start."' AND '".$c_end."'
      "
    .$fsk_lock."
      "
    .$group_check."
      order by m.manufacturers_name
     "
    );

    ... diese Zeilen ...
    Code: PHP  [Auswählen]
      and     p.products_id = p2c.products_id
      and     p2c.categories_id BETWEEN '".$c_start."' AND '".$c_end."'
    ... zusammenfassen, bzw. in Abhängigkeit stellen?

    ... also p.products_id = p2c.products_id aber nur, wenn der p2c.products_id eine p2c.categories_id gegenübersteht, welche aus dem Bereich BETWEEN '".$c_start."' AND '".$c_end."' ist.

    Kann man das überhaupt verketten und wenn ja, wie muss das aussehen, bzw. welcher Befehl muss dazwischen?
    Ich hab' schon versucht die Lösung zu googeln, allerdings weiß ich nicht so genau was ich Tante G. fragen muss, um eine geeignete Lösung zu finden ;-)



    Linkback: https://www.modified-shop.org/forum/index.php?topic=25552.0
    rechtstexte für onlineshop

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.868
    • Geschlecht:
    Verstehe wohl nicht, denn genau das was du willst tut die Query doch bereits, nicht ?

    Gruß,
    noRiddle

    0815

    • Viel Schreiber
    • Beiträge: 905
    Hi,

    tut sie leider nicht.
    es werden alle Produkt IDs ausgegeben, weil auch alle IDs in der Tabelle Products_To_Categories enthalten sind.

    Es fehlt in der Abfrage der direkte Zusammenhang zwischen den Spalten.
    Es sollen ja nur die Produkt Ids ausgegeben werden, welche den Categorie IDs aus der BETWEEN Abfrage gegenüber stehen.

    Mit anderen Worten: Zeige mir alle Produkte aus den Kategorin 5-8.
    Im Moment werden leider alle Produkte eines Herstellers angezeigt, unabhängig davon ob sie einer der Kategorien aus der BETWEEN Abfrage verlinkt sind. Denn so bald auch nur ein Produkt in einer der Kategorien verlinkt ist, werden alle Produkte des Herstellers angezeigt.

    Es müsste also irgendwie so aussehen:
    Code: PHP  [Auswählen]
    and     p.products_id = p2c.products_id aber nur wenn p2c.categories_id BETWEEN '".$c_start."' AND '".$c_end."
    Ich habe allerdings keine Ahnung wie man das verknüpft ... wenn das überhaupt so möglich ist?

    WayneTsun

    • Fördermitglied
    • Beiträge: 1.082
    • Geschlecht:
    Hi zusammen!

    Also ich habe die Abfrage bei mir überprüft und muss noRiddle recht geben. Die Abfrage funktioniert ganz in Deinem Sinne. Einzig die Variablen '".$c_start."' AND '".$c_end."' habe ich z.B. durch '10' und '20' ersetzt. Hast du entsprechend die Variablen auch richtig bestimmt?

    Beste Grüße,
    Wayne

    0815

    • Viel Schreiber
    • Beiträge: 905
    Es ist ein Multishopsystem.
    Jeder Shop hat seinen eigenen Kategoriebereich. Die Artikel sind in der PRODUCTS_TO CATEGORIES diesen Bereichen zugeordnet.

    Beispiel:
    -Artikel gibt es von Nummer 1000-3000
    -Shop 1 Kategoriebereich (ID) 100-200 und Produkt (ID) 1000-2000
    -Shop 2 Kategoriebereich (ID) 201-300 und Produkt (ID) 2001-3000
    etc.

    Wenn jetzt Shop 2 aufgerufen wird, gibt de BETWEEN Abfrage 201-300 aus.
    Produkt IDs sollten dann nur jene ausgegeben werden, welche mit dem Kategoriebereich 201-300 verlinkt sind (also nur Produkt (ID) 2001-3000).
    Es werden mit der Abfrage zwar tatsächlich die Produkte eines Herstelers (z.B. Hersteller A) ausgegeben, welche verlinkt sind, darüber hinaus aber auch alle Produkte von Hersteller A, die nicht mit dem Kategoriebereich 201-300 verlinkt sind (also aus Produkt (ID) 1000-2000).

    Ich hoffe es ist so ein wenig verständlicher ohne weiter ins Detail zu gehen.
    Ich denke nicht, dass man die Problematik in einem normalen modified (also ohne Mutishop Option) korrekt nachstellen kann.

    0815

    • Viel Schreiber
    • Beiträge: 905
    Mist!
    Ich bekomm's nicht hingebogen.

    Habe mich jetzt schon an einem Subselect versucht, allerdings scheint das auch nicht des Rätsels Lösung zu sein:

    Code: PHP  [Auswählen]
    $manufacturers_query = xtDBquery("
                    select distinct
                                    m.manufacturers_id,
                                    m.manufacturers_name,
                                    m.manufacturers_image
                    from    "
    .TABLE_MANUFACTURERS." m,
                                    "
    .TABLE_PRODUCTS." p,
                                    "
    .TABLE_PRODUCTS_TO_CATEGORIES." p2c
                    where   m.manufacturers_id = p.manufacturers_id
                    and     p.products_status = 1
                    and     p.products_id = p2c.products_id
                    and     p2c.products_id IN
                    (SELECT p2c.products_id from "
    .TABLE_PRODUCTS_TO_CATEGORIES." p2c where p2c.categories_id BETWEEN '".$c_start."' AND '".$c_end."')
                    "
    .$fsk_lock."
                    "
    .$group_check."
                    order by m.manufacturers_name
            "
    );

    cYbercOsmOnauT

    • modified Team
    • Beiträge: 914
    • Geschlecht:
    Ich könnte mir höchstens vorstellen, dass die Anführungsstriche beim BETWEEN ein Problem erzeugen könnten, denn die Angabe der Werte zwischen welchen selektiert werden soll sind Integerwerte und keine Strings. Also versuch es mal mit
    Code: SQL  [Auswählen]
    AND p2.categories_id BETWEEN {$c_start} AND {$c_end}
    wahlweise
    Code: SQL  [Auswählen]
    AND p2.categories_id BETWEEN ".$c_start." AND ".$c_end."
    oder auch
    Code: SQL  [Auswählen]
    AND (p2.categories_id BETWEEN {$c_start} AND {$c_end})
    Ansonsten tut die SQL oben das was Du beschreibst und möchtest.
    Viele Grüße,
    Tekin Birdüzen - Zend Certified Engineer

    John_Delay

    • Mitglied
    • Beiträge: 124
    • Geschlecht:
    Hallo 0815,

    hmmm, kann auf Anhieb auch nix fehlerhaftes erkennen. Hier ein paar Tipps & Fragen, die Dir evtl. helfen könnten:

    1. Was beinhalten die Variablen $fsk_lock und $group_check genau? Fangen die z.B. auch mit einem "and" an? Bzw. ist es korrekt, wie das SELECT in Zeile 14 endet, mit - .."') - ?

    2. Lass Dir mal kurz vor dem query die Variablen ausgeben z.B. per:
    Code: PHP  [Auswählen]
    echo ('<script type="text/javascript">alert("'.$c_start.'\n'.$c_end.'\n'.$fsk_lock.'\n'.$group_check.'");</script>');
    um zu sehen, ob auch wirklich alles wie gewollt ankommt. Es könnte dann ggf. zu Fehlermeldungen kommen (z.B.: "header already sent ..." oder dergleichen), aber ist ja nur zum debuggen ...

    3. Tippe am Ende jeder Zeile innerhalb des queries mal ein Leerzeichen ein ...

    4. Benenne mal die beiden "p2c" am Ende von Zeile 13 um in irgend etwas anderes. Vielleicht hat er ein Problem mit der doppelten Referenzierung der Tabelle TABLE_PRODUCTS_TO_CATEGORIES .

    5. Muss das "IN" am Ende von Zeile 12 nicht "ON" heißen? Bin mir grade nicht sicher ...

    6. Hast Du mal versucht, das mit JOINS zu lösen statt mit Subselects? MySQL-Optimizer kommt angeblich mit Joins besser zurecht.
    Zitat
    ... es werden alle Produkt IDs ausgegeben, weil auch alle IDs in der Tabelle Products_To_Categories enthalten sind.
    das könnte doch evtl. mit LEFT JOIN gelöst werden ...

    Gruß, Ingo

    P.S.: Bitte nacheinander testen, damit wir rausfinden können, woran es lag, falls irgendwas davon hilfreich sein sollte ... kannste ja dann berichten, dann lernen alle anderen (mich eingeschlossen) auch was ;-)

    Ach und noch was: Du könntest auch des ganze query mal in ein Variable (z.B. $sql) packen und es dann ausführen als $manufacturers_query = xtDBquery($sql);
    Kurz vor Ausführung siehst Du den geamten String mal an z.B. mit obiger <script>-Ausgabe.

    0815

    • Viel Schreiber
    • Beiträge: 905
    Guten Morgen,

    die Between Abfrage funktioniert einwandfrei, denn es werden für die Abfrage die korrekten Werte (von/bis) augegeben. Daran kann's eigentlich nicht liegen.

    Zitat von: cYbercOsmOnauT
    Ansonsten tut die SQL oben das was Du beschreibst und möchtest.

    Ja und nein.
    Das Problem scheint zu sein, dass die Abfrage für die Produkte die Abfrage für die Kategorien nich berücksichtigt.

    Beide Abfragen für sich funktionieren:
    Code: PHP  [Auswählen]
    and     p.products_id = p2c.products_id
    ... selektiert alle Produkte aus der Tabelle PRODUCTS, die in der Tabelle PRODUCTS_TO_CATEGORIES vorhanden sind.
    Code: PHP  [Auswählen]
    die BETWEEN Abfrage
    ... gibt den Teil Kategorien aus, die der entsprechenden Domain zugeordnet sind.
    Im Shop werden dann die Logos der entsprechenden Hersteller korrekt geladen und angezeigt, beim Klick auf die Logos werden dann jedoch leider immer alle Produkte des entsprechenden Herstellers aufgerufen und nicht nur die in diesem Shop verlinkten.

    Es findet also keine gegenseitige Berücksichtigung statt.
    Eigentlich sehe ich ja auch keinen Fehler in der Abfrage, aber offensichtlicht fehlt da noch etwas.

    WayneTsun

    • Fördermitglied
    • Beiträge: 1.082
    • Geschlecht:
    Gut, dass man auf die Art Schritt für Schritt erfährt, was du eigentlich willst.
    Also kurz gesagt: Die Abfrage funktioniert einwandfrei, denn damit suchst Du die Manufacturers aus der Datenbank heraus, die den beschriebenen Vorgaben entsprechen.

    Wenn Du aber nach(!) dieser Abfrage den Links zu den Produkten dieser Manufacturers eine Bedingung übergeben willst, so hat das mit der ersten Abfrage erst mal nichts zu tun, sondern ist ein weiterer Schritt, den Du nun benötigst.

    Man sollte halt immer genau beschreiben, was man eigentlich sucht. ;-)

    Beste Grüße,
    Wayne

    0815

    • Viel Schreiber
    • Beiträge: 905
    Zitat von: John_Delay
    1. Was beinhalten die Variablen $fsk_lock und $group_check genau? Fangen die z.B. auch mit einem "and" an? Bzw. ist es korrekt, wie das SELECT in Zeile 14 endet, mit - .."') - ?
    Da ich die beiden Werte in meinem Shop gar nicht brauche (waren in der Standardabfrage enthalten), habe ich die Abfragen zum Test entfernt, was jedoch keinen Unterschied gemacht hat. Daran liegt's also schon mal nicht.

    Zitat von: John_Delay
    2. Lass Dir mal kurz vor dem query die Variablen ausgeben z.B. per:
    Code: PHP  [Auswählen]
    echo ('<script type="text/javascript">alert("'.$c_start.'\n'.$c_end.'\n'.$fsk_lock.'\n'.$group_check.'");</script>');
    um zu sehen, ob auch wirklich alles wie gewollt ankommt. Es könnte dann ggf. zu Fehlermeldungen kommen (z.B.: "header already sent ..." oder dergleichen), aber ist ja nur zum debuggen ...
    Es werden die von/bis Kategorie-IDs korrekt ausgegeben. Da ich keine FSK18 Freigaben habe und es keine gesonderten Berechtigungen für einzelne Kundengruppen in meinen Shops gibt, wird für diese beiden Werte nichts ausgegeben.

    Zitat von: John_Delay
    3. Tippe am Ende jeder Zeile innerhalb des queries mal ein Leerzeichen ein ...
    Bringt keine Veränderung

    Zitat von: John_Delay
    4. Benenne mal die beiden "p2c" am Ende von Zeile 13 um in irgend etwas anderes. Vielleicht hat er ein Problem mit der doppelten Referenzierung der Tabelle TABLE_PRODUCTS_TO_CATEGORIES .
    Das hat zum Ergebnis, dass alles geladen wird, d.h. alle Produkte und alle Hersteller. Auch die Hersteller welche in dem Shop gar nicht verlinkt sind.

    Zitat von: John_Delay
    5. Muss das "IN" am Ende von Zeile 12 nicht "ON" heißen? Bin mir grade nicht sicher ...
    "ON" führt zu einem SQL Fehler.

    Zitat von: John_Delay
    6. Hast Du mal versucht, das mit JOINS zu lösen statt mit Subselects? MySQL-Optimizer kommt angeblich mit Joins besser zurecht.
    Zitat
    ... es werden alle Produkt IDs ausgegeben, weil auch alle IDs in der Tabelle Products_To_Categories enthalten sind.
    das könnte doch evtl. mit LEFT JOIN gelöst werden ...
    Wie hat das auszusehen? Kenne mich mit Joins leider gar nicht aus.

    Zitat von: John_Delay
    Ach und noch was: Du könntest auch des ganze query mal in ein Variable (z.B. $sql) packen und es dann ausführen als $manufacturers_query = xtDBquery($sql);
    Kurz vor Ausführung siehst Du den geamten String mal an z.B. mit obiger <script>-Ausgabe.
    Schwierig, denn ich kann die ganze Angelegenheit wegen der Multishopproblematik zur Zeit leider nur im Liveshop testen. Kann ich also erst heute Nacht testen.

    0815

    • Viel Schreiber
    • Beiträge: 905
    Zitat von: WayneTsun
    Man sollte halt immer genau beschreiben, was man eigentlich sucht. ;-)

    Habe ich ja versucht, allerdings ist es nicht wirklich einfach, wenn man selbst nicht so genau weiß was da mit der Datenbank passiert.
    Ich bin kein Programmierer, versuche jedoch stets alles so zu beschreiben, dass jeder geistig folgen kann.
    Da es vermutlich nur wenige Forenmitglieder gibt, die einen selbstgebastelten XTC Multishop haben, macht dies die Sache nicht unbedingt einfacher.

    John_Delay

    • Mitglied
    • Beiträge: 124
    • Geschlecht:
    Hallo 0815 nochmal,

    Zitat
    Schwierig, denn ich kann die ganze Angelegenheit wegen der Multishopproblematik zur Zeit leider nur im Liveshop testen. Kann ich also erst heute Nacht testen.

    Nö, stimmt nicht. Bette das 'echo' doch in eine If-Anweisung mit
    Code: PHP  [Auswählen]
    if($_SERVER['REMOTE_ADDR'] == 'DEINE_IP_ADRESSE') {
       echo('<script type="..."> ... bla blub code ... </script>');
    }
    dann sollte es nur Dir angezeigt werden ... (ok, Ausnahme wäre da ein Proxy - aber gehe mal davon aus, dass Du / Ihr sowas nicht nutzt). Falls Du Dich mit der Sache jedoch unwohl fühlst, solltest Du es in der Tat auf heute Nacht verschieben.

    Was die JOINS betrifft, musst´e Dich mal per Suchmaschine schlau machen. Das ist nicht in 2 Sätzen erklärt - und Dir das umzuschreiben wäre (zumindest für mich) auch nicht mal eben in 2 Minuten gemacht - muss arbeiten und Geld verdienen :lol: .

    Außerdem sollte das Ganze ja nur ne Hilfestellung zur Selbsthilfe für Dich sein. Denke, mehr kannst Du hier eh nicht erwarten, denn Du hast nicht nur keine Standard-Installation mehr, sondern obendrein nicht mal einen modified Shop sondern einen XTC Shop (wenn ich das richtig verstanden habe) ... ist nicht böse gemeint - sind nur Tatsachen und machen eine Hilfestellung in einem modified Forum nicht leichter.

    Gruß, Ingo

    0815

    • Viel Schreiber
    • Beiträge: 905
    Hi,

    das mit dem echo werde ich gleich mal ausprobieren.
    Hätte ich auch selbst drauf kommen können, denn eine entsprechende Abfrage hab' ich schon anderswo verbaut. Muss man aber auch nicht über die IP machen. Hier mal der entsprechende Code aus einer html Datei. Muss man für php Dateien natürlich ohne die php Tags  und zusätzlichen Klammern verwenden:

    Code: PHP  [Auswählen]
    {php}if ((int)$_SESSION['customer_id'] == '1'){{/php}{$box_MANUFACTURERS}{php}}{/php}
    ... also sichtbar nur für Admins.

    Das mit dem JOIN hatte ich schon in mehrerern Varianten ausprobiert und gegoogelt, allerdings habe ich offensichtlich keine für mich verständliche Anleitung gefunden. Ich weiß deshalb nicht, ob meine Ansätze falsch waren, oder ob ein JOIN nicht des Rätsels Lösung ist.
    Werde mich gleich nochmals daran versuchen.

    Ich fand die Subselect Geschichte eigentlich logischer und hatte die JOIN-Variante nach einigen Try and Error Versuchen deshalb ersmal wieder verworfen.
    ... wie gesagt, das mit deM JOIN hab' ich nicht wirklich verstanden.

    Ach ja, es ist definitiv ein modified Multishop ich kürze das nur gelegentlich als xtc ab.

    John_Delay

    • Mitglied
    • Beiträge: 124
    • Geschlecht:
    Achso ok, na das konnte ich ja nicht wissen ... ;-)

    Das mit der IP habe ich geschrieben, gerade weil Du mitgeteilt hast, dass es ein Multi-Shop ist und ich nicht wusste, ob ggf. noch andere Admins darin unterwegs sind.

    Gruß, Ingo
    3 Antworten
    2570 Aufrufe
    25. April 2014, 12:56:57 von möCöm
    2 Antworten
    1959 Aufrufe
    25. November 2012, 20:14:28 von NicoDeluxe
    3 Antworten
    2662 Aufrufe
    22. Dezember 2010, 12:14:33 von Ello
    8 Antworten
    4967 Aufrufe
    14. Juli 2018, 15:51:34 von hpzeller