Abfrage über 2 Tabellen, aber wie?

xxhappyxx

Benutzer
Beiträge
6
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
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.579
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.
 

xxhappyxx

Benutzer
Beiträge
6
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.
 

xxhappyxx

Benutzer
Beiträge
6
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?
 

ukulele

Datenbank-Guru
Beiträge
4.579
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
 

xxhappyxx

Benutzer
Beiträge
6
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?
 

ukulele

Datenbank-Guru
Beiträge
4.579
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 . "'
 

xxhappyxx

Benutzer
Beiträge
6
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.
 

ukulele

Datenbank-Guru
Beiträge
4.579
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...
 
Werbung:

xxhappyxx

Benutzer
Beiträge
6
:) 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
 
Oben