1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Abfrage über 2 Tabellen, aber wie?

Dieses Thema im Forum "MySQL" wurde erstellt von xxhappyxx, 27 Januar 2012.

  1. xxhappyxx

    xxhappyxx Benutzer

    Hallo zusammen,

    Ich stehe zur Zeit ganz schön auf dem Schlauch und würde mich über ein wenig Hilfe sehr freuen.

    Folgende Ausgangslage:

    1 Tabelle "PRODUCTS" mit Produktdaten wie Hersteller, EK-Preis und weiteren sowie 1 Tabelle "PRODUCTS_GROUPS" mit 3 Spalten mit den Bezeichnungen customers_group_id, customers_group_price und product_id .
    In der Tabelle "PRODUCTS_GROUPS" exestieren zur Zeit 2 Werte für customers_group_id, (1 und 2) sowie die unterschiedlichen Preise in customers_group_price. Somit werden jeder Product_id 2 unterschiedliche Preise (je nach Kundengruppe) zugeordnet.

    Nun sollen diese Werte in eine Tabelle ausgegeben werden wo sie auch editiert werden können. Hier der Code für die Abfage und Anzeige:

    Code:
      function tep_quickstock_product_listing($sel_id){
                    global $lang_id;
                    global $manufacturers_list;
                    global $filter_type;
     
     
                    if (tep_not_null($sel_id)) {
     
                            if($filter_type==1){
                                    $sql2 = tep_db_query("SELECT p.products_barcode, p.products_base_price, p.products_model, p.products_id, p. products_quantity, p.products_status, p.products_weight, p.vendors_product_price, p.products_price, p.manufacturers_id, pd.products_name, pd.language_id, ptc.categories_id from products p, products_to_categories ptc, products_description pd where p.products_id = ptc.products_id and p.products_id = pd.products_id and ptc.categories_id = '" . $sel_id . "' and pd.language_id = '" . (int)$lang_id . "' order by pd.products_name");
                                    }
                                    else{
                                    $sql2 = tep_db_query("SELECT p.products_barcode, p.products_base_price, p.products_model, p.products_id, p. products_quantity, p.products_status, p.products_weight, p.vendors_product_price, p.products_price, p.manufacturers_id, pd.products_name, pd.language_id, ptc.categories_id from products p, products_to_categories ptc, products_description pd where p.products_id = ptc.products_id and p.products_id = pd.products_id and p.manufacturers_id = '" . $sel_id . "' and pd.language_id = '" . (int)$lang_id . "' order by pd.products_name");
                                    }
     
     
     
     
          while ($results = tep_db_fetch_array($sql2)) {
     
                      //check the item status
                      $active = ($results['products_status'] == 1) ? ' checked="CHECKED"' : '';
                      $inactive = ($results['products_status'] == 0) ? ' checked="CHECKED"' : '';
     
     
                      //create mannufacture select statement
                      if($filter_type==1){
                                    $catman_select = tep_quickstock_manufacturer_selectorEx($manufacturers_list, $results['products_id'],$results['manufacturers_id']);
                            }
                            else {
            $catman_select = tep_quickstock_category_selectorEx($results['products_id'],$results['categories_id'],false);
                            }
     
                      $doChange = 'changed(\'stock_update[' . $results['products_id'] . '][changed]\');';
          $doValidate_flt = 'javascript: this.value = validate (this.value, 2, 0);';
          $doValidate_int = 'javascript: this.value = validate (this.value, 0, 1);';
                ?>
            <tr class="dataTableRow">
            <td class="dataTableContent" align="center"><input type="checkbox" name="stock_update[<?php echo  $results['products_id'] ?>][changed]" />
            <input type="hidden" name="stock_update[<?php echo  $results['products_id'] ?>][ptc]" value="<?php echo $results['categories_id'] ?>" /></td>
            <td class="dataTableContent" align="center"><?php echo $results['products_id'] ?></td>
            <td class="dataTableContent" align="center"><input type="text" size="<?php echo QUICK_STOCK_MODELSIZE ?>" name="stock_update[<?php echo  $results['products_id'] ?>][model]" value="<?php echo $results['products_model'] ?>" onChange="<?php echo $doChange?>"></td>
            <td class="dataTableContent" align="center"><?php echo $catman_select?></td>
            <td class="dataTableContent" align="center"><input type="text" size="<?php echo QUICK_STOCK_MODELSIZE ?>" name="stock_update[<?php echo $results['products_id'] ?>][products_barcode]" value="<?php echo $results['products_barcode'] ?>" onChange="<?php echo $doChange?>"></td>
            <td class="dataTableContent" align="left" ><?php echo $results['products_name'] ?></td>
            <td class="dataTableContent" align="center"><input type="text" size="<?php echo QUICK_STOCK_WEIGHTSIZE ?>" name="stock_update[<?php echo $results['products_id'] ?>][weight]" value="<?php echo $results['products_weight'] ?>" onChange="<?php echo $doChange?>"></td>
            <td class="dataTableContent" align="center"><input type="text" size="<?php echo QUICK_STOCK_PRICESIZE ?>" name="stock_update[<?php echo $results['products_id'] ?>][vendors_product_price]" value="<?php echo number_format($results['vendors_product_price'],QUICK_STOCK_PRICEDEC,'.',','); ?>" onChange="<?php echo $doChange?>" onBlur="<?php echo $doValidate_flt?>" ></td>
            <td class="dataTableContent" align="center"><input type="text" size="<?php echo QUICK_STOCK_PRICESIZE ?>" name="stock_update[<?php echo $results['products_id'] ?>][customers_group_price_1]" value="<?php echo number_format($results['products_price'],QUICK_STOCK_PRICEDEC,'.',','); ?>" onChange="<?php echo $doChange?>" onBlur="<?php echo $doValidate_flt?>" ></td>
            <td class="dataTableContent" align="center"><input type="text" size="<?php echo QUICK_STOCK_PRICESIZE ?>" name="stock_update[<?php echo $results['products_id'] ?>][customers_group_price_2]" value="<?php echo number_format($results['products_price'],QUICK_STOCK_PRICEDEC,'.',','); ?>" onChange="<?php echo $doChange?>" onBlur="<?php echo $doValidate_flt?>" ></td>
            <td class="dataTableContent" align="center"><input type="text" size="<?php echo QUICK_STOCK_PRICESIZE ?>" name="stock_update[<?php echo $results['products_id'] ?>][price]" value="<?php echo number_format($results['products_price'],QUICK_STOCK_PRICEDEC,'.',','); ?>" onChange="<?php echo $doChange?>" onBlur="<?php echo $doValidate_flt?>" ></td>
            <td class="dataTableContent" align="center"><input type="text" size="<?php echo QUICK_STOCK_BASEPRICESIZE ?>" name="stock_update[<?php echo $results['products_id'] ?>][products_base_price]" value="<?php echo $results['products_base_price'] ?>" onChange="<?php echo $doChange?>"></td>
            <td class="dataTableContent" align="center"><?php echo $results['products_quantity'] ?><input type="hidden" size="4" name="stock_update[<?php echo $results['products_id'] ?>][oldstock]" value="<?php echo $results['products_quantity'] ?>" onChange="<?php echo $doChange?>"></td>
            <td class="dataTableContent" width = "50px" align="center"><input type="text" size="<?php echo QUICK_STOCK_STOCKSIZE ?>" name="stock_update[<?php echo $results['products_id'] ?>][newstock]" value="0" onChange="<?php echo $doChange?>" onBlur="<?php echo $doValidate_int?>" ></td>
            <td class="dataTableContent" align="center" ><input type="radio" name="stock_update[<?php echo $results['products_id'] ?>][active]" value="1" <?php echo $active ?> onClick="<?php echo $doChange?>"></td>
            <td class="dataTableContent" align="center" ><input type="radio" name="stock_update[<?php echo $results['products_id'] ?>][active]" value="0" <?php echo $inactive ?> onClick="<?php echo $doChange?>"></td>
            </tr>
          <?php
          }
        }
      }
    Das heißt, bei der Ausgabe soll bei customers_group_price_1 der Wert für die Kundengruppe 1 und bei customers_group_price_2 der Wert für die Kundengruppe 2 ausgegeben werden. Zur Zeit sehen da noch zu Testzwecken die Werte "'products_price'" welche noch angepasst werden müssen.

    Leider haben meine Bemühungen das auf die Reihe zu bekommen zu keinem Ergebnis geführt. Wenn erst mal die Ausgabe funzen würde, würde ich mich schon sehr freuen, wenn dann in einem 2ten Schritt das Rückschreiben zum laufen kommt wäre mein Tag perfekt.

    Gruß Thomas
     
  2. ukulele

    ukulele Datenbank-Guru

    if($filter_type==1){
    $sql2 = tep_db_query("SELECT p.products_barcode, p.products_base_price, p.products_model, p.products_id, p. products_quantity, p.products_status, p.products_weight, p.vendors_product_price, p.products_price, p.manufacturers_id, pd.products_name, pd.language_id, ptc.categories_id from products p, products_to_categories ptc, products_description pd where p.products_id = ptc.products_id and p.products_id = pd.products_id and ptc.categories_id = '" . $sel_id . "' and pd.language_id = '" . (int)$lang_id . "' order by pd.products_name");
    }
    else{
    $sql2 = tep_db_query("SELECT p.products_barcode, p.products_base_price, p.products_model, p.products_id, p. products_quantity, p.products_status, p.products_weight, p.vendors_product_price, p.products_price, p.manufacturers_id, pd.products_name, pd.language_id, ptc.categories_id from products p, products_to_categories ptc, products_description pd where p.products_id = ptc.products_id and p.products_id = pd.products_id and p.manufacturers_id = '" . $sel_id . "' and pd.language_id = '" . (int)$lang_id . "' order by pd.products_name");
    }
    Das ist ja der eigentliche SQL Code und außer dem Leerschritt zwischen p. und products_quantity kann ich nichts problematisches sehen, die Syntax scheint richtig. Wenn die keine Werte zurück geben, stimmen irgendwelche Einträge nicht oder es fehlen passende Datensätze. In diesem Fall würden z.B. nur Einträge in Products angezeigt, wenn auch eine Description in der passenden Lanaguage vorliegt. Wird die Variable nicht richtig gefüllt oder gibt es keine passenden Daten kann die DB auch nicht liefern.
     
  3. xxhappyxx

    xxhappyxx Benutzer

    Hallo ukulele,

    erst mal ein dickes Danke für deine schnelle Antwort. Der von mir gepostete Code läuft einwandfrei. Es handelt sich aber um den ursprünglichen Code für die Tabelle PRODUCTS ohne die Abfrage für die 2te Tabelle. Und genau da ist mein Problem. Ich weiß nicht wie die richtig einzufügen ist. Alle meine Versuche waren erfolglos.
     
  4. xxhappyxx

    xxhappyxx Benutzer

    Ich hab mir nun folgende Abfrage überlegt:

    Code:
                          if($filter_type==1){
                                    $sql2 = tep_db_query("SELECT p.products_barcode, p.products_base_price, p.products_model, p.products_id, p.products_quantity, p.products_status, p.products_weight, p.vendors_product_price, p.products_price, p.manufacturers_id, pd.products_name, pd.language_id, ptc.categories_id from products p, products_to_categories ptc, products_description pd where p.products_id = ptc.products_id and p.products_id = pd.products_id and ptc.categories_id = '" . $sel_id . "' and pd.language_id = '" . (int)$lang_id . "' order by pd.products_name");
                                    $cg_price_query_1 = tep_db_query("select customers_group_price from " . TABLE_PRODUCTS_GROUPS . " where customers_group_id = '1' and products_id = '" . $sel_id . "' ");
                                    $cg_price_query_2 = tep_db_query("select customers_group_price from " . TABLE_PRODUCTS_GROUPS . " where customers_group_id = '2' and products_id = '" . $sel_id . "' ");
                                    }
                                    else{
                                    $sql2 = tep_db_query("SELECT p.products_barcode, p.products_base_price, p.products_model, p.products_id, p.products_quantity, p.products_status, p.products_weight, p.vendors_product_price, p.products_price, p.manufacturers_id, pd.products_name, pd.language_id, ptc.categories_id from products p, products_to_categories ptc, products_description pd where p.products_id = ptc.products_id and p.products_id = pd.products_id and p.manufacturers_id = '" . $sel_id . "' and pd.language_id = '" . (int)$lang_id . "' order by pd.products_name");
                                    $cg_price_query_1 = tep_db_query("select customers_group_price from " . TABLE_PRODUCTS_GROUPS . " where customers_group_id = '1' and products_id = '" . $sel_id . "' ");
                                    $cg_price_query_2 = tep_db_query("select customers_group_price from " . TABLE_PRODUCTS_GROUPS . " where customers_group_id = '2' and products_id = '" . $sel_id . "' ");
                                    }
     
     
     
     
          while ($results = tep_db_fetch_array($sql2)) {
    
    Nun hänge ich aber bei der Zuordnung des array in der letzten Zeile. Weiß jemand Rat?
     
  5. ukulele

    ukulele Datenbank-Guru

    Wenn ich dich jetzt richtig verstehe suchst du soetwas hier:
    Code:
    SELECT    p.products_barcode,
            p.products_base_price,
            p.products_model,
            p.products_id,
            p.products_quantity,
            p.products_status,
            p.products_weight,
            p.vendors_product_price,
            p.products_price,
            p.manufacturers_id,
            pd.products_name,
            pd.language_id,
            ptc.categories_id,
            pg1.customers_group_price AS customers_group_price1,
            pg2.customers_group_price AS customers_group_price2
    FROM    products p,
            products_to_categories ptc,
            products_description pd,
            products_groups pg1,
            products_groups pg2
    WHERE    p.products_id = ptc.products_id
    AND        p.products_id = pd.products_id
    AND        p.products_id = pg1.products_id
    AND        p.products_id = pg2.products_id
    AND        pg1.customers_group_id = '1'
    AND        pg2.customers_group_id = '2'
    AND        ptc.categories_id = '" . $sel_id . "'
    AND        pd.language_id = '" . (int)$lang_id . "'
    ORDER BY pd.products_name
     
    Walter gefällt das.
  6. xxhappyxx

    xxhappyxx Benutzer

    Hurra, mein Tag ist gerettet. Die Abfrage macht was sie soll. :) Danke ukulele!!

    Gibt es auch eine Möglichkeit die Abfrage so zu gestallten das sie zur nächsten p_id übergeht wenn die Felder pg1 und pg2 nicht belegt sind? So wie es jetzt ist werden ja nur die Artikel ausgelesen, die auch in der Tabelle PRODUTCS_GROUP vorhanden sind. Das wäre nur zur Sicherheit, wenn aus irgend einem Grund die mal nicht gefüllt sein sollten. (Fehler bei der Produktanlage oder ähnliches.)

    Bleibt noch das zurückschreiben in die Datenbank. Das ist der org. Code.
    Code:
    $sql = "UPDATE products
    SET          products_barcode = '".$items['products_barcode']."',
                      products_base_price = '".$items['products_base_price']."',
                      products_quantity = '".$current_stock."',
                      products_model = '".$items['model']."',
                      products_price = '".$items['price']."',
                      products_weight = '".$items['weight']."',
                      vendors_product_price = '".$items['vendors_product_price']."',
                      manufacturers_id = '".$items['manufacturer']."',
                      products_status = '".$items['active']."'
    WHERE    products_id = $key";
    
    Ich wollte es so machen:
    Code:
    $sql = "UPDATE products, products_groups
    SET          products_barcode = '".$items['products_barcode']."',
                      products_base_price = '".$items['products_base_price']."',
                      products_quantity = '".$current_stock."',
                      products_model = '".$items['model']."',
                      products_price = '".$items['price']."',
                      products_weight = '".$items['weight']."',
                      vendors_product_price = '".$items['vendors_product_price']."',
                      manufacturers_id = '".$items['manufacturer']."',
                      products_status = '".$items['active']."',
                      pg1.customers_group_price = '".$items['customers_group_price1']."',
                      pg2.customers_group_price = '".$items['customers_group_price2']."'
    WHERE    products_id = $key";
    
    Aber da tut sich nichts. :(

    Vielleicht würdest du da noch mal einen Blick drauf werfen?
     
  7. ukulele

    ukulele Datenbank-Guru

    Geht glaube ich auf unterschiedliche Weise, da ich aber nicht so sehr mit den JOIN Varianten arbeite sondern meist SELECTs einsetze (strengenommen natürlich auch ein JOIN) würde ich 2 Abfragen machen und zusammen führen:
    Code:
    SELECT  p.products_barcode,
            p.products_base_price,
            p.products_model,
            p.products_id,
            p.products_quantity,
            p.products_status,
            p.products_weight,
            p.vendors_product_price,
            p.products_price,
            p.manufacturers_id,
            pd.products_name,
            pd.language_id,
            ptc.categories_id,
            pg1.customers_group_price AS customers_group_price1,
            pg2.customers_group_price AS customers_group_price2
    FROM    products p,
            products_to_categories ptc,
            products_description pd,
            products_groups pg1,
            products_groups pg2
    WHERE  p.products_id = ptc.products_id
    AND    p.products_id = pd.products_id
    AND    p.products_id = pg1.products_id
    AND    p.products_id = pg2.products_id
    AND    pg1.customers_group_id = '1'
    AND    pg2.customers_group_id = '2'
    AND    ptc.categories_id = '" . $sel_id . "'
    AND    pd.language_id = '" . (int)$lang_id . "'
    UNION ALL
    SELECT  p.products_barcode,
            p.products_base_price,
            p.products_model,
            p.products_id,
            p.products_quantity,
            p.products_status,
            p.products_weight,
            p.vendors_product_price,
            p.products_price,
            p.manufacturers_id,
            pd.products_name,
            pd.language_id,
            ptc.categories_id,
            NULL AS customers_group_price1,
            NULL AS customers_group_price2
    FROM    products p,
            products_to_categories ptc,
            products_description pd
    WHERE  p.products_id = ptc.products_id
    AND    p.products_id = pd.products_id
    AND    p.products_id NOT IN (    SELECT    products_id
                                    FROM    products_groups )
    AND    ptc.categories_id = '" . $sel_id . "'
    AND    pd.language_id = '" . (int)$lang_id . "'
     
  8. xxhappyxx

    xxhappyxx Benutzer

    Hallo ukulele,

    danke für deine tolle Unterstützung. Hab mit SQL nicht soviel am Hut und bin für jede Hilfe dankbar.

    Dieser Code läuft soweit einwandfrei. Ich versuche ihn nur noch zu verstehen. ;)

    Bekomme ich das ORDER BY pd.products_name auch noch irgendwie wieder rein? Die Ausgabe ist sonst ein wenig unübersichtlich.
     
  9. ukulele

    ukulele Datenbank-Guru

    Das sind zwei Abfragen die per UNION ALL einfach in eine Ergebnissmenge einfließen. Die Spaltenanzahl und Beschaffenheit (Datentyp) muss dabei identisch sein (daher auch die NULL Werte für die Spalte customers_group_price). Das Ordnen dieser Ergebnissmenge ist leider nur durch Verschachtelung der Abfrage möglich:
    Code:
    SELECT    *
    FROM (    SELECT  p.products_barcode,
                    p.products_base_price,
                    p.products_model,
                    p.products_id,
                    p.products_quantity,
                    p.products_status,
                    p.products_weight,
                    p.vendors_product_price,
                    p.products_price,
                    p.manufacturers_id,
                    pd.products_name,
                    pd.language_id,
                    ptc.categories_id,
                    pg1.customers_group_price AS customers_group_price1,
                    pg2.customers_group_price AS customers_group_price2
            FROM    products p,
                    products_to_categories ptc,
                    products_description pd,
                    products_groups pg1,
                    products_groups pg2
            WHERE  p.products_id = ptc.products_id
            AND    p.products_id = pd.products_id
            AND    p.products_id = pg1.products_id
            AND    p.products_id = pg2.products_id
            AND    pg1.customers_group_id = '1'
            AND    pg2.customers_group_id = '2'
            AND    ptc.categories_id = '" . $sel_id . "'
            AND    pd.language_id = '" . (int)$lang_id . "'
            UNION ALL
            SELECT  p.products_barcode,
                    p.products_base_price,
                    p.products_model,
                    p.products_id,
                    p.products_quantity,
                    p.products_status,
                    p.products_weight,
                    p.vendors_product_price,
                    p.products_price,
                    p.manufacturers_id,
                    pd.products_name,
                    pd.language_id,
                    ptc.categories_id,
                    NULL AS customers_group_price1,
                    NULL AS customers_group_price2
            FROM    products p,
                    products_to_categories ptc,
                    products_description pd
            WHERE  p.products_id = ptc.products_id
            AND    p.products_id = pd.products_id
            AND    p.products_id NOT IN (    SELECT    products_id
                                            FROM    products_groups )
            AND    ptc.categories_id = '" . $sel_id . "'
            AND    pd.language_id = '" . (int)$lang_id . "' ) AS tabelle
    ORDER BY products_name
    ...oder so...
     
  10. xxhappyxx

    xxhappyxx Benutzer

    :) Perfekt so läuft es wie es soll! DANKE!!!!

    Code:
    $sql2 = tep_db_query("SELECT    *
    FROM (SELECT
            p.products_barcode,
            p.products_base_price,
            p.products_model,
            p.products_id,
            p.products_quantity,
            p.products_status,
            p.products_weight,
            p.vendors_product_price,
            p.products_price,
            p.manufacturers_id,
            pd.products_name,
            pd.language_id,
            ptc.categories_id,
            pg1.customers_group_price AS customers_group_price1,
            pg2.customers_group_price AS customers_group_price2
    FROM    products p,
            products_to_categories ptc,
            products_description pd,
            products_groups pg1,
            products_groups pg2
    WHERE  p.products_id = ptc.products_id
    AND    p.products_id = pd.products_id
    AND    p.products_id = pg1.products_id
    AND    p.products_id = pg2.products_id
    AND    pg1.customers_group_id = '1'
    AND    pg2.customers_group_id = '2'
    AND    ptc.categories_id = '" . $sel_id . "'
    AND    pd.language_id = '" . (int)$lang_id . "'
    UNION ALL
    SELECT  p.products_barcode,
            p.products_base_price,
            p.products_model,
            p.products_id,
            p.products_quantity,
            p.products_status,
            p.products_weight,
            p.vendors_product_price,
            p.products_price,
            p.manufacturers_id,
            pd.products_name,
            pd.language_id,
            ptc.categories_id,
            NULL AS customers_group_price1,
            NULL AS customers_group_price2
    FROM    products p,
            products_to_categories ptc,
            products_description pd
    WHERE  p.products_id = ptc.products_id
    AND    p.products_id = pd.products_id
    AND    p.products_id NOT IN (    SELECT    products_id
                                    FROM    products_groups )
    AND    ptc.categories_id = '" . $sel_id . "'
    AND    pd.language_id = '" . (int)$lang_id . "') AS tabelle
    ORDER BY products_name");
    Jetzt werde ich mich nochmals an das Rückschreiben der Daten machen. Vielleicht schaffe ich es ja.

    Gruß Thomas
     
Die Seite wird geladen...

Diese Seite empfehlen