Shop Support News Archive - Shopbetreiber News -> Forum : Open Source Shop Software xt eCommerce Templates Module SEO Support: : Bestellübersicht Verbessern
Da ich viele Downloadprodukte habe, möchte ich in der Bestellübersnicht sehen, ob/wieviel die Leute gedownloaded haben.
Also eine zusätzliche Spalte "DL" in admin/orders.php einfügen.
Problem ist der MySQL-Select-Befehl. Meine erweiterte Version zeigt mir einige Bestellungen doppelt an:
Original:
admin/orders.php
ca. Zeile 685:
$orders_query_raw = "select o.orders_id, o.orders_status, o.afterbuy_success, o.afterbuy_id, o.customers_name, o.payment_method, o.date_purchased, o.last_modified, o.currency, o.currency_value, s.orders_status_name, ot.text as order_total from ".TABLE_ORDERS." o left join ".TABLE_ORDERS_TOTAL. Anwalt Hamm" ot on (o.orders_id = ot.orders_id), ".TABLE_ORDERS_STATUS." s where (o.orders_status = s.orders_status_id and s.language_id = '".$_SESSION['languages_id']."' and ot.class = 'ot_total') or (o.orders_status = '0' and ot.class = 'ot_total' and**s.orders_status_id = '1' and s.language_id = '".$_SESSION['languages_id']."') order by o.orders_id DESC";
Meine Variante:
$orders_query_raw = "select distinct o.orders_id, o.orders_status, o.afterbuy_success, o.afterbuy_id, o.customers_name, o.payment_method, o.date_purchased, o.last_modified, o.currency, o.currency_value, s.orders_status_name, ot.text as order_total, opd.download_count ".
********"from ".TABLE_ORDERS." o left join ".TABLE_ORDERS_TOTAL. Anwalt Hamm" ot on (o.orders_id = ot.orders_id and opd.orders_id=o.orders_id), ".TABLE_ORDERS_STATUS." s, ".TABLE_ORDERS_PRODUCTS_DOWNLOAD." opd ".
********"where (o.orders_status = s.orders_status_id and s.language_id = '".$_SESSION['languages_id']."' and ot.class = 'ot_total') ".
********"or (o.orders_status = '0' and ot.class = 'ot_total' and**s.orders_status_id = '1' and s.language_id = '".$_SESSION['languages_id']."') ".
********"order by o.orders_id DESC";
Wie müsste die Abfrage aussehen?
Die Optionen "left join" und "on" sind mir nicht klar in diesem Fall.
lockdron
22.05.2007, 10:58
Ich stand zwar mit Joins schon immer etwas auf Kriegsfuß (ich nutz sie zwar, aber wirklich 'mögen' tu ich sie nicht), aber du hast hier definitif einen kleinen Fehler drin:
on (o.orders_id = ot.orders_id and opd.orders_id=o.orders_id),der Teil nach dem AND hat hier nix zu suchen. 1. sollten bei JOINS sowieso nur die Spalten, die zur Verknüpfung dienen verwendet werden und 2. hat das nach dem AND überhaupt nichts mit dem JOIN zu tun.
Ungetestet würde ich etwas in dieser Art versuchen:
FROM
****orders_total ot
****LEFT JOIN**orders o
********ON (o.orders_id = ot.orders_id ),
****LEFT JOIN products_download opd
********ON (opd.orders_id=o.orders_id),
****orders_status sSry, aber ich hab's versucht etwas übersnichtlicher zu gestalten, darum auch nicht die gleiche "Struktur" wie bei dir.
Um's genauer sagen zu können, müsste ich's erst testen, aber das macht ohne die zusätzliche Spalte wahrscheinlich relativ wenig Sinn.
Und ein kleiner Tip für die Übersnichtlichkeit:
Auch wenn's im XTC-Core nicht gemacht wurde, sollten SQL-Kommandos immer groß geschrieben werden. Ist zwar keine Pflnicht, aber üblich.
by lockdron
Erst einmal Danke für den Versuch.
''>ZITAT(lockdron @ May 22 2007, 10:58) 26604 Ich stand zwar mit Joins schon immer etwas auf Kriegsfuß (ich nutz sie zwar, aber wirklich 'mögen' tu ich sie nicht), aber du hast hier definitif einen kleinen Fehler drin:
on (o.orders_id = ot.orders_id and opd.orders_id=o.orders_id),der Teil nach dem AND hat hier nix zu suchen. 1. sollten bei JOINS sowieso nur die Spalten, die zur Verknüpfung dienen verwendet werden und 2. hat das nach dem AND überhaupt nichts mit dem JOIN zu tun.
Ungetestet würde ich etwas in dieser Art versuchen:
FROM
****orders_total ot
****LEFT JOIN**orders o
********ON (o.orders_id = ot.orders_id ),
****LEFT JOIN products_download opd
********ON (opd.orders_id=o.orders_id),
****orders_status s
Um's genauer sagen zu können, müsste ich's erst testen, aber das macht ohne die zusätzliche Spalte wahrscheinlich relativ wenig Sinn.
Und ein kleiner Tip für die Übersnichtlichkeit:
Auch wenn's im XTC-Core nicht gemacht wurde, sollten SQL-Kommandos immer groß geschrieben werden. Ist zwar keine Pflnicht, aber üblich.
by lockdron [/b]
Leider kann man die Kommandos nicht groß schreiben, weil ich dann immer SQL-Fehler erhalte. XTC scheint das in seiner mysql-Abfragefunktion nicht zu mögen.
Hier jetzt mein Block mit deiner Änderung, der leider einen Fehler ausschmeisst und mir ist das echt zu hoch und blicke da nicht durch.
$orders_query_raw = "select distinct o.orders_id, o.orders_status, o.afterbuy_success, o.afterbuy_id, o.customers_name, o.payment_method, o.date_purchased, o.last_modified, o.currency, o.currency_value, s.orders_status_name, ot.text as order_total, opd.download_count ".
********"from ".TABLE_ORDERS_TOTAL. Anwalt Hamm" ot ".
********"left join ".TABLE_ORDERS." o".
********"on (o.orders_id = ot.orders_id), ".
********"left join ".TABLE_ORDERS_PRODUCTS_DOWNLOAD." opd ".
************"on (opd.orders_id=o.orders_id), ".
********TABLE_ORDERS_STATUS." s, ".
********"where (o.orders_status = s.orders_status_id and s.language_id = '".$_SESSION['languages_id']."' and ot.class = 'ot_total') ".
********"or (o.orders_status = '0' and ot.class = 'ot_total' and**s.orders_status_id = '1' and s.language_id = '".$_SESSION['languages_id']."') ".
********"order by o.orders_id DESC";
Man kann das ja umgeformt direkt in MySQL-Admin testen :-)
Hier wäre das direkte Statement:
SELECT DISTINCT o.orders_id, o.orders_status, o.afterbuy_success,**o.afterbuy_id, o.customers_name, o.payment_method, o.date_purchased,**o.last_modified, o.currency, o.currency_value, s.orders_status_name,**ot.text as order_total, opd.download_count
********FROM orders_total ot
********LEFT JOIN orders o
************ON (o.orders_id = ot.orders_id),
********LEFT JOIN orders_products_download opd
************ON (opd.orders_id=o.orders_id),
********orders_status s,
********WHERE**(o.orders_status = s.orders_status_id and s.language_id = '1' and ot.class = 'ot_total')
********OR**(o.orders_status = '0' and ot.class = 'ot_total'**and**s.orders_status_id = '1' and s.language_id =**'1')
********ORDER BY o.orders_id DESC
Irgendetwas mag er daran nicht in der Nähe vom LEFT JOIN orders o ON ....
lockdron
22.05.2007, 12:33
SELECT DISTINCT o.orders_id, o.orders_status, o.afterbuy_success,**o.afterbuy_id, o.customers_name, o.payment_method, o.date_purchased,**o.last_modified, o.currency, o.currency_value, s.orders_status_name,**ot.text as order_total, opd.download_count
********FROM orders_total ot
********LEFT JOIN orders o
************ON (o.orders_id = ot.orders_id)
********LEFT JOIN orders_products_download opd
************ON (opd.orders_id=o.orders_id),
********orders_status s
********WHERE**(o.orders_status = s.orders_status_id and s.language_id = '1' and ot.class = 'ot_total')
********OR**(o.orders_status = '0' and ot.class = 'ot_total'**and**s.orders_status_id = '1' and s.language_id =**'1')
********ORDER BY o.orders_id DESCbischen Fantasie -.-
Da waren paar Kommas falsch gesetzt.
by lockdron
Danke.
Es funktioniert, aber eigentlich wie vorher, aber ich merke, dass ein Gedankenfehler bei mir drin war. Einige Bestellungen zeigt er doppelt an, weil deren Produkte unterschiedliche Werte für die Downloadanzahl haben.
Insofern ist das völlig korrekt.
Viellenicht kannst du mir bei einem einfacheren Problem helfen:
Ich möchte alle Produkte auflisten, die entweder im Produkt-Namen "VIP" haben oder im Attribut "VIP" aufweisen und deren Preis- sowie Attributszuschlagssummen anzeigen:
SELECT DISTINCT op.orders_id, op.products_id, op.products_name, count(distinct op.orders_products_id) as anzahl, sum(opa.options_values_price) as summe1, sum(op.products_price) as summe2
FROM orders o, orders_products op, products p, orders_products_attributes opa
WHERE o.orders_id = op.orders_id
AND op.orders_products_id=opa.orders_products_id
AND op.products_id=p.products_id
AND (opa.products_options_values LIKE "%VIP%"**or op.products_name LIKE "%VIP%")
GROUP BY p.products_id DESC
Beispielprodukte:
VIP-Serie mit Attributen "Variante: Option1" und "Medium: Option1 und Option2"
Normale Serie mit Attribut "Variante: VIP-Version" und "Medium: CD/DVD"
Problem ist, dass Produkte mit "VIP" im Namen eben mit zwei Attributen in der orders_products_attributes stehen und damit auch doppelt in der Summe der Preise gezählt werden. Man müsste irgendwie DISTINCT oder ähnliches auch auf die opa.orders_products_id anwenden.
Ein Distinct in "sum(DISTINCT opa.options_values_price)" mag MySQL leider zusätzlich nicht.
lockdron
22.05.2007, 15:20
SELECT DISTINCT op.orders_id, op.products_id, op.products_name, count(distinct op.orders_products_id) as anzahl, sum(opa.options_values_price) as summe1, sum(op.products_price) as summe2
FROM
orders o
****INNER JOIN orders_products op ON (o.orders_id = op.orders_id)
****INNER JOIN products p ON (op.products_id=p.products_id)
****INNER JOIN orders_products_attributes opa ON (op.orders_products_id=opa.orders_products_id)
WHERE
(opa.products_options_values LIKE "%VIP%"**XOR op.products_name LIKE "%VIP%")
GROUP BY p.products_id DESCso würde ich das in der Theorie veruschen.
In der Praxis hab ich keine Attribute, weshalb ich's nicht testen kann : /
Von der Logik her sollte es dank dem GROUP BY meiner Meinung nach eigentlich keine Probleme machen, wegen mehreren Attributen. Aber wie gesagt kann ich das nicht testen.
Leider hab ich aber ATM nicht die Zeit, mir das genauer anzuschauen, sry.
by lockdron
Bingo, Treffer, 100 Punkte, versenkt
:lol:
DANKE !
Hmmm. Heute baute ich die Abfrage in php ein und komischerweise stimmen die Summen doch nicht. weder in PHP noch in MySQL direkt. Er zählt immer noch doppelte Summen bei dem Produkt, was VIP im Namen hat und zwei Attribute existieren.
Es ist auch nicht genau der doppelte Preis.
komisch. Ich war mir sicher, dass es gestern funktionierte. Argll.. :wacko:
vBulletin® v3.8.4, Copyright ©2000-2012, Jelsoft Enterprises Ltd.