SQL - Abfrageproblem

anti43

nicht mehr wegzudenken
Hi,

Ich steh grad aufm SQL Schlauch, eventuell kann mir ja hier jemand weiterhelfen..

Ich habe 2 Tabellen, vereinfacht dargestellt:

PHP:
stock:
productid | quantity

und

PHP:
sold_items:
productid


nun möchte ich eine Abfrage erstellen, welche als Ergebnismenge folgendes enthält.. pseudocode:
PHP:
productid | quantity | count(productid in sold_items)
1             | 32         | 543
etc

ich weiss irgendwie nicht, wie ich das count() in ne join Abfrage reinbekomme .. :(

select productid, quantity, count(sold_items.productid) from stock left outer join sold_items ???

Danke schonmal,

Gruß Andreas
 
Also ich weiß gerade nicht so ganz, ob ich Dein Vorhaben richtig durchschaut habe. Wenn Dich richtig verstehe möchtest Du errechnen, wie viele "In-Stock-Produkte" noch auf Lager sind, wenn man die Menge der "Sold-Produkte" abgezogen hat.
Wenn das bis hierhin richtig ist, würde ich keine Joni-Abfrage durchführen, sondern zwei gesonderte Abfragen.

Also zunächst:
PHP:
$sql = mysql_query("SELECT COUNT(*) FROM stock WHERE produkt_id = '$produktnummer'");
$result_array = mysql_fetch_row ($sql);
$auf_lager = $result_array[0];

dann:
PHP:
$sql = mysql_query("SELECT COUNT(*) FROM sold WHERE produkt_id = '$produktnummer'");
$result_array = mysql_fetch_row ($sql);
$verkauft = $result_array[0];

und dann halt rechnen:
PHP:
$bestand = $auf_lager - $verkauft;
echo "Noch $bestand Stück auf Lager!";
 
Hi!

Ja ok, mein Vorhaben hast du richtig erkannt :)
Das problem ist, bei einer Datenbank mit 10.000 Produkten 10.000*2 Abfragen durchzufuehren waehre wohl eher sub-optimal :)

Ich probier mal noch ein bisschen :)
 
Keine Ahnung ob es klappt, eventuell noch anpassen.

PHP:
$sql = "SELECT COUNT(st.inhalt_stock) 
        FROM stock AS st 
                LEFT JOIN sold AS so ON (st.produkt_id = so.produkt_id)";
 
Das problem ist, bei einer Datenbank mit 10.000 Produkten 10.000*2 Abfragen durchzufuehren waehre wohl eher sub-optimal :)

Ich sehe, du bist ein Performance-Fetischist ;)
Ich weiß es auch nicht, aber die Lösung von JimDuggan sieht auf den reinen Blick recht gut aus. Ansonsten möchte ich einfach mal behaupten, dass zwei simple Count-Abfragen auch keine Datenbank oder gar ein Server zusammenbrechen wird. :weg
 
HmHm also so gehts nicht :) :

PHP:
select stock.PRODUCTSIDS, stock.COUNTVALUE, count(sold.productsids) from stock LEFT OUTER JOIN sold ON sold.productsids = stock.productsids

Resultat:

Wenn die SELECT-Liste mindestens ein Aggregat enthält, müssen alle Einträge gültige Aggregatausdrücke sein.

also kann man offensichlich eine Abfrage und eine count() Funktion NICHT mixen. Das ist bloed :)

Natuerlich bricht kein Server ueber ne count Abfrage zusammen, jedoch ueber 10000 ?

Nochmal um das ganze deutlich zu machen:

PHP:
productid | quantity | count
------------------------------------------------------------------------
1              | 32          | count(productid in sold_items)  <- erste Abfrage
2              | 33          | count(productid in sold_items) 
3              | 34          | count(productid in sold_items) 

....

9996        | 36          | count(productid in sold_items) 
9997        | 39          | count(productid in sold_items) 
9998        | 23          | count(productid in sold_items) 
9999        | 54          | count(productid in sold_items) <- 9999. Abfrage
etc

Entweder ich hab nen Knick in der SQL Optik oder das wird ewig dauern..
Echt seltsam, finde ich. warum ist das so ein Problem? Ist doch ne alltaegliche Aufgabe..
 
Kein Subselect mögich?

PHP:
SELECT (SELECT quantity FROM stock WHERE productid='$pID') AS quant, (SELECT count(*) FROM sold_items) AS sold;

Dann ziehst du quant und sold raus, und machst die Berechnung. Alternativ sollte in stock eigentlich ein weiteres Feld vorhanden sein, wo bei einem Verkauf bereits quantity-1 drinsteht, oder direkt in quantity ein Abzug erfolgt, falls du das Feld nicht noch als Archiv brauchst..
PHP:
SELECT (SELECT quantity FROM stock WHERE productid='$pID') AS quant, (SELECT count(*) FROM sold_items) AS sold, SUM(quant,-sold) as ausgabe;
Müsste ebenfalls funktionieren, wenn mich nicht alles verlässt..

LG
 
Das müsste mit "GROUP BY" gehen.

Man gruppiert diejenigen Spalten, die ohne Aggregatfunktion ausgegeben werden sollen.
Das dient dazu, dass dann pro Gruppe, also in Deinem Fall pro ermittelte Anzahl ein Datensatz entsteht.

Also würde ich es so probieren:

Code:
SELECT st.productid, quantity, count(si.productid) 
FROM stock st LEFT JOIN sold_items si USING (productid) 
GROUP BY st.productid, quantity;
 
Oben