Door
Jaimy A
op 18-12-2014 18:14
gewijzigd op 18-12-2014 18:28
2.159 views
hallo allemaal,
Ik loop een beetje vast met het volgende,
Ik heb een mysql tabel met data: Adcount_Input
Code die ik nu al heb:
<?php
$Count_Stock = "SELECT * FROM Adcount_input";
$result = mysql_query($Count_Stock) or die(mysql_error());
while($row = mysql_fetch_array($result)) {
$framemaat = preg_replace('/\D/', '', $row['framemaat']); // Enkel cijfers graken door deze filter
$ean13 = $row['ean13'];
mysql_query("INSERT IGNORE INTO Adcount_output(ean13) VALUES('$ean13')") or die(mysql_error());
$Count_frames = "SELECT count(*) FROM Adcount_input WHERE ean13='$ean13' LIKE '%$framemaat%' ";
$result = mysql_query($Count_frames) or die(mysql_error());
$row = mysql_fetch_row($result);
// Should show you an integer result.
echo $row[0].'<br />';
}?>
1 -> Verbinding met Adcount_input
2 -> Weergeef enkel cijfers die zich in kolom "framemaat" bevinden door middel van preg_replace
3 -> Controleer of "Adcount_input.ean13" al wordt weergeven in "Adcount_output.ean13"
4 -> Indien 3 = negatief -> INSERT Adcount_output.ean13
Nu is het de bedoeling dat ik de frame maten groepeer en tel.
TrekT80J15 45CM = (3)
TrekT80J15 50CM = (2)
TrekT80J15 55CM = (1)
KogaEdeluxe15 45CM = (2)
KogaEdeluxe15 50CM = (2)
Hier voor wou ik gebruik maken van de volgende code (zie code hierboven):
<?php
$Count_frames = "SELECT count(*) FROM Adcount_input WHERE ean13='$ean13' LIKE '%$framemaat%' ";
?>
bedoeling is dat ik in Adcount_output een tabel krijg zoals voorbeeld:
eventjes alles samengevat:
Ik probeer de data van Adcount_input te verplaatsen naar Adcount_output
Terwijl dit gebeurt moet de data "framemaat" gegroepeerd worden per framemaat
en geteld worden hoeveel ik heb van elke framemaat.
en dit allemaal moet in Adcount_Output worden opgeslagen
een string uit elkaar rafelen is altijd veel minder makkelijk dan een string samenstellen.
Conclusie: haal al die cm en c/c er uit en maak die kolom van het type integer. Indien je per se bij de ene cm en bij de andere c/c wilt vermelden dan maak je daar een nieuwe kolom voor aan. Verder tevens het advies om een tabel framematen te maken en de gebruiker bij het invoeren enkel een dropdown voor de neus te zetten zodat zij verplicht een bestaande framemaat moeten selecteren.
In plaats van 3 query's op het resultaat van een andere query in een lus, kan je dit met één query af.
Om te beginnen gaan we de aantallen in één keer ophalen:
SELECT
p.id_product_attribute,
p.ean13,
p.upc,
COUNT(*) amount
FROM
shop_product_attribute p
JOIN
Adcount_input a
ON p.ean13 = a.ean13 AND p.upc = a.framemaat
/* eventuele where */
GROUP BY p.id_product_attribute, p.ean13, p.upc
Wat je waarschijnlijk niet weet is dat je met een update ook joins kan gebruiken, dus gaan we bovenstaande als een subquery (virtuele tabel) in de update plaatsen:
UPDATE shop_stock_available s
JOIN (
SELECT
p.id_product_attribute,
p.ean13,
p.upc,
COUNT(*) amount
FROM
shop_product_attribute p
JOIN
Adcount_input a
ON p.ean13 = a.ean13 AND p.upc = a.frame_maat
/* eventuele where */
GROUP BY p.id_product_attribute, p.ean13, p.upc
) q
USING (id_product_attribute)
SET
s.quantity = q.amount
Wow is zoveel korter dan mijn code :D moet ik mij later eens in verdiepen hoe dit juist in zijn werk gaat.
@gert
U code werkt buiten dat je frame_maat had getypt indeplaats van framemaat klopte het volledig.
Is dit de juist manier om dit te laten loopen of is een loop niet nodig en is een mysql_insert voldoende ?
<?php
$get_input = "UPDATE shop_stock_available s
JOIN (SELECT p.id_product_attribute, p.ean13, p.upc, COUNT(*) amount FROM shop_product_attribute p
JOIN Adcount_input a ON p.ean13 = a.ean13 AND p.upc = a.framemaat
GROUP BY p.id_product_attribute, p.ean13, p.upc) q
USING (id_product_attribute) SET s.quantity = q.amount ";
$result_input = mysql_query($get_input) or die(mysql_error());
while($input_row = mysql_fetch_array($result_input)) { }
?>
EDIT:
je code werkt dus zo als ik het goed voorheb:
"UPDATE shop_stock_available s s is de nieuwe naam voor shop_stock_available
waardoor je een colom die in shop_stock_available staat kunt oproepen zoals bijvoorbeeld: s.quantity
Klopt, dat heet een alias en helemaal volledig is het met AS ervoor. Je hoeft dan niet telkens de gehele tabelnaam in te geven bij het aangeven van de kolommen.
Het is een update query, dus je krijgt true of false terug dus je zou eigenlijk een foutmelding moeten krijgen, want dat is boolean en geen pointer naar een recordset.
DE code is niet alleen korter maar stukken efficiënter.
Stel dat Adcount_input 500 rijen bevat dan voer je 1500 queries meer uit ....