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
    Kein Problem (beides!)

    Ich bin überhaupt froh, dass ich hier Hilfe erhalte.
    Danke :-)

    0815

    • Viel Schreiber
    • Beiträge: 905
    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.

    Das habe ich eben mal versucht, aber ich weiß nicht wie die Datenbankabfrage in den code verpackt werden muss.
    Code: PHP  [Auswählen]
    if ((int)$_SESSION['customer_id'] == '1') {
           echo('<script type="text/javascript">alert("'.bla bla?.'");</script>');
        }

    Hab's wegen Unkenntnis mal so versucht:
    Code: PHP  [Auswählen]
    if ((int)$_SESSION['customer_id'] == '1') {
           echo('<script type="text/javascript">alert("'.$manufacturers_query = xtDBquery($sql).'");</script>');
        }

    Da kam dann folgende Fehlermeldung:
    Code: PHP  [Auswählen]
    1065 - Query was empty

    So geht's leider auch nicht:
    Code: PHP  [Auswählen]
    $manufacturers_query = xtDBquery($sql);        
    if ((int)$_SESSION['customer_id'] == '1') {
           echo('<script type="text/javascript">alert("'.$sql.'");</script>');
        }

    Kannst Du mir da bitte weiterhelfen, damit ich die Ausgabe hier posten kann?
    Danke

    John_Delay

    • Mitglied
    • Beiträge: 124
    • Geschlecht:
    Hallo, ja kein Problem:

    naja, so wie ich das hier beschrieben hatte: http://www.modified-shop.org/forum/index.php?topic=25552.msg234410#msg234410

    Also erst alles das, was in Deinem 1. bzw. 4. Post in Klammern hinter 'xtDBquery' stand, in die Variable $sql packen:
    Code: PHP  [Auswählen]
    $sql = ('...');
    Dann den Aufruf, wie Du selbst schon schriebst (Dein letzter Versuch, allerdings die 1 ohne Hochkommata):
    Code: PHP  [Auswählen]
    if ((int)$_SESSION['customer_id'] == 1) {
           echo('<script type="text/javascript">alert("'.$sql.'");</script>');
    }
    Und erst danach die eigentliche Ausführung mit:
    Code: PHP  [Auswählen]
    $manufacturers_query = xtDBquery($sql);
    Falls der String zu lang werden und keine Zeilenumbrüche enthalten sollte, also sozusagen das alert-Fenster "sprengt", dann schreib einfach nur "echo $sql;" innerhalb der If-Anweisung ... wird ja eh nur Dir angezeigt. Nur hält die Script-Ausführung dann nicht an der Stelle an und wartet auf deine OK-Eingabe ... das mit dem "<script>" hat meistens, aber nicht immer Vorteile :-D .

    Gruß, Ingo

    0815

    • Viel Schreiber
    • Beiträge: 905
    Ahso, mit 'ner guten Erklärung kann man das auch nachvollziehen.
    Danke für die Anleitung, ich werd's gleich mal ausprobieren.

    0815

    • Viel Schreiber
    • Beiträge: 905
    Hmmm  :motz:

    Ich hab's jetzt so:
    Code: PHP  [Auswählen]
    $sql = ("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"
    );

    if ((int)$_SESSION['customer_id'] == '1') {echo $sql;}
    $manufacturers_query = xtDBquery($sql);

    Als Ausgabe erhalte ich damit nur ...
    Code: PHP  [Auswählen]
    SELECT distinct m.manufacturers_id, m.manufacturers_name, m.manufacturers_image from manufacturers m, products p, 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 products_to_categories p2c where p2c.categories_id BETWEEN '11000' AND '11999') order by m.manufacturers_name

    Ist doch bestimmt wieder nur ein Problem mit Semikolons, Anführungszeichen, oder Hochkommata  :-(
    Mit Try and Error habe ich schon einige Variationen durch, aber leider haut's bei jedem Fehlversuch trotz Adminabfrage den Liveshop weg.

    ... ist das kompliziert, wenn man's nicht gelernt hat. Sorry, wenn ich mich da ein wenig dumm anstelle.  :datz:

    Werde gleich noch diese Variante testen (statt Anführungszeichen mit Hochkommata, auch in der Subselect Anweisung). Im Editor wird damit jedenfalls kein Fehler angezeigt ;-)
    Code: PHP  [Auswählen]
    $sql = ('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'
    );

    ... "leider" sind im Moment zu viele Kunden online.

    0815

    • Viel Schreiber
    • Beiträge: 905
    Nein, Variante 2. geht gar nicht und mit Variante 1. kommt nicht mehr heraus als oben angegeben.

    John_Delay

    • Mitglied
    • Beiträge: 124
    • Geschlecht:
    Ja, tu das ... dann sieht der String auch anders aus, denn dann sind die Werte für $c_start und $c_end nicht mehr in Hochkommata sondern stehen als INTEGER da ... vielleicht hilft das. Wenn nicht, würde ich nochmal versuchen ALLE "p2c"-Statements (also 3 Stück) innerhalb des eingebetteten SubSELECTs rauszunehmen. Falls es das nicht war, kann ich hier leider auch nicht mehr helfen ... wie gesagt: dann mal mit JOINS probieren.

    Gruß, Ingo

    Edit: Achso, ... unsere Posts haben sich überschnitten. Dann nimm mal probeweise die Hochkommata der BETWEEN-Werte aus Variante 1 heraus ...

    Matt

    • Experte
    • Beiträge: 4.241
    Ich häng mich hier mal frech rein, ohne alles gelesen zu haben. Gibt es einen Grund für diesen SubSelect? Das bekommt man doch auch ohne hin. Die Query aus dem ersten Post sollte funktionieren, wenn die Werte korrekt sind. Was liefert denn
    Code: SQL  [Auswählen]
    SELECT DISTINCT m.manufacturers_id, m.manufacturers_name, m.manufacturers_image FROM manufacturers m, products p, 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 '11000' AND '11999' ORDER BY m.manufacturers_name
    direkt in MySQL ausgeführt? Und wenn es zu viele Datensätze liefert, was sagt denn ein EXPLAIN?

    0815

    • Viel Schreiber
    • Beiträge: 905
    Zitat von: John_Delay
    Edit: Achso, ... unsere Posts haben sich überschnitten. Dann nimm mal probeweise die Hochkommata der BETWEEN-Werte aus Variante 1 heraus ...

    Ehrlich gesagt verliere ich langsam den Faden mit den Hochkommata und Anführungszeichen.
    Da der Shop zur Zeit noch gut besucht ist, kann ich vermutlich erst heute Nacht mit Try & Error weiter basteln. Auch mit dem Join werde ich mich dann nochmal näher beschäftigen.

    Zitat von: Matt
    Gibt es einen Grund für diesen SubSelect?

    Ja, es handelt sich um einen modified Multishop und die erste Abfrage bringt leider immer alle Produkte eines Herstellers und nicht nur die im Satelitenshop verlinkten.

    Zitat von: Matt
    Die Query aus dem ersten Post sollte funktionieren, wenn die Werte korrekt sind. Was liefert denn ...

    Die Abfrage gibt nur die korrekten Werte für m.manufacturers_id, m.manufacturers_name und m.manufacturers_image. ... jetzt versteh' ich gar nichts mehr?!
    Im Shop werden zu den Herstellern die Produkte ausgegeben, allerdings leider nicht nur die verlinkten, sondern jeweils alle Produkte dieser Hersteller.

    0815

    • Viel Schreiber
    • Beiträge: 905
    Oh, jetzt dämmert mir was da evtl. falsch läuft.
    Die Abfrage ist wahrscheinlich gar nicht dazu geeignet, die Produkte auszugeben.
    Durch das von mir angepasste Modul von Gunnart http://www.gunnart.de/tipps-und-tricks/xtcommerce-ein-paar-ideen-fuer-category-images/ wird am Ende nur eine Suchanfrage mit dem Herstellernamen generiert und die findet dann wohl alle Produkte die im System sind.

    Wenn ich Recht habe, gehe ich an die Sache wohl mit dem absolut falschen Ansatz heran.

    Wahrscheinlich muss ich dann diesen Teil aus dem Modul entsprechend anpassen:
    Code: PHP  [Auswählen]
    while ($manufacturers = xtc_db_fetch_array($manufacturers_query, true)) {
                    $Output[] = array(
                            'name'  =>      $manufacturers['manufacturers_name'],
                            'link'  =>      xtc_href_link(FILENAME_DEFAULT, xtc_manufacturer_link($manufacturers['manufacturers_id'],$manufacturers['manufacturers_name'])),
                            'image' =>      is_file(DIR_WS_IMAGES.$manufacturers['manufacturers_image']) ? DIR_WS_IMAGES.$manufacturers['manufacturers_image'] : false,
                            'class' =>      ($_GET['manufacturers_id'] == $manufacturers['manufacturers_id']) ? ' class="Current"' : false
                    );
            }

    Der Link muss dann noch angepasst werden. Wie kann man denn das da mit einbauen?
    Code: PHP  [Auswählen]
    (SELECT p2c.products_id from ".TABLE_PRODUCTS_TO_CATEGORIES." p2c where p2c.categories_id BETWEEN '".$c_start."' AND '".$c_end."')

    ...es wäre ja auch langweilig wenn's easy wäre *stöhn*

    Matt

    • Experte
    • Beiträge: 4.241
    In der Tat sucht deine Abfrage nur Hersteller, keine Produkte. Die Abfrage nach Produkten musst du genauso einschränken wie die nach Herstellern.

    0815

    • Viel Schreiber
    • Beiträge: 905
    Ich will nicht unverschämt sein, aber hast Du dazu evtl. einen Ansatz zur Hand?
    Mit meinem SQL Halbwissen sitze ich da sonst wieder Stunden, wenn nicht sogar Tage dran.

    Code: PHP  [Auswählen]
    'link'  =>      xtc_href_link(FILENAME_DEFAULT, xtc_manufacturer_link($manufacturers['manufacturers_id'],$manufacturers['manufacturers_name'])),

    Diese Zeile ist wohl entscheidend, aber wie soll ich da die Einschränkung einbauen? Da geht's ja gar nicht um die Produkte. Es wird ja nur eine Suchanfrage mit dem Herstellernamen generiert.

    Matt

    • Experte
    • Beiträge: 4.241
    Richtig. Diese Zeile ist nicht wirklich entscheidend. Du musst die Query überarbeiten, die dir alle Produkte eines Herstellers ausgibt, damit sie die Multishop-Struktur berücksichtigt. Ohne Zugriff auf den Code hat das aber was von :glaskugel:

    0815

    • Viel Schreiber
    • Beiträge: 905
    Das Glaskugel-Problem kann ich lösen ... siehe Anlage. ;-)

    Matt

    • Experte
    • Beiträge: 4.241
    Bringt nichts. Die fragliche Codestelle ist die, die benutzt wird, wenn dieser Herstellerlink aufgerufen wird. Könnte in der includes/modules/default.php sein.
    3 Antworten
    2599 Aufrufe
    25. April 2014, 12:56:57 von möCöm
    2 Antworten
    1993 Aufrufe
    25. November 2012, 20:14:28 von NicoDeluxe
    3 Antworten
    2717 Aufrufe
    22. Dezember 2010, 12:14:33 von Ello
    8 Antworten
    5063 Aufrufe
    14. Juli 2018, 15:51:34 von hpzeller