PHP MYSQL LIKE Command
Ik loop een beetje vast met het volgende,
Ik heb een mysql tabel met data:
Adcount_Input
Code die ik nu al heb:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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 />';
}?>
$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):
Code (php)
1
2
3
2
3
<?php
$Count_frames = "SELECT count(*) FROM Adcount_input WHERE ean13='$ean13' LIKE '%$framemaat%' ";
[/code]?>
$Count_frames = "SELECT count(*) FROM Adcount_input WHERE ean13='$ean13' LIKE '%$framemaat%' ";
[/code]?>
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
Gewijzigd op 18/12/2014 18:28:54 door Jaimy A
Als je het wil wil nummeren kun je toch beter een for loop gebruiken zou ik denken?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
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());
$framecounter = 0;
$Count_frames = "SELECT * FROM Adcount_input WHERE ean13='$ean13' LIKE '$framemaat' ";
while($row = mysql_fetch_array($Count_frames)) {
$framecounter++;
$row['framemaat'];
}
echo $ean13.'('.$framemaat.')'.' = '.$framecounter.'<br />';
}
?>
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());
$framecounter = 0;
$Count_frames = "SELECT * FROM Adcount_input WHERE ean13='$ean13' LIKE '$framemaat' ";
while($row = mysql_fetch_array($Count_frames)) {
$framecounter++;
$row['framemaat'];
}
echo $ean13.'('.$framemaat.')'.' = '.$framecounter.'<br />';
}
?>
Gewijzigd op 18/12/2014 18:46:59 door Jaimy A
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.
Gewijzigd op 18/12/2014 18:50:26 door Frank Nietbelangrijk
heb u conclusie een beetje gevolgd, heb eerst een sql uitgevoerd die de data herschrijft zonder cm , c/c, ...
en dan heb ik mijn code volledig herschreven. wat vinden jullie hiervan ? kan het sneller ? veilger? eenvoudiger? het werkt in elk geval al wel
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
$get_input = "SELECT * FROM Adcount_input";
$result_input = mysql_query($get_input) or die(mysql_error());
while($input_row = mysql_fetch_array($result_input)) {
$ean13 = $input_row['ean13'];
$framesize = $input_row['framemaat'];
$get_frame = "SELECT count(framemaat) AS aantal FROM Adcount_input WHERE framemaat = '$framesize' AND ean13 = '$ean13' ";
$result_frame = mysql_query($get_frame) or die(mysql_error());
while($frame_row = mysql_fetch_array($result_frame)) {
$frame_quantity = $frame_row['aantal'];
$get_attribute = "SELECT * FROM shop_product_attribute WHERE ean13 = '$ean13' AND upc = '$framesize' ";
$result_attribute = mysql_query($get_attribute) or die(mysql_error());
while($attribute_row = mysql_fetch_array($result_attribute)) {
$attribute_id = $attribute_row['id_product_attribute'];
echo 'EAN13:'.$ean13.' FRAMESIZE:'.$framesize.' ATTRIBUTE_ID:'.$attribute_id.' FRAMEQUANTITY:'.$frame_quantity.'<br />';
mysql_query("UPDATE shop_stock_available SET quantity='$frame_quantity' WHERE id_product_attribute = '$attribute_id'")
or die(mysql_error());
}
}
}
?>
$get_input = "SELECT * FROM Adcount_input";
$result_input = mysql_query($get_input) or die(mysql_error());
while($input_row = mysql_fetch_array($result_input)) {
$ean13 = $input_row['ean13'];
$framesize = $input_row['framemaat'];
$get_frame = "SELECT count(framemaat) AS aantal FROM Adcount_input WHERE framemaat = '$framesize' AND ean13 = '$ean13' ";
$result_frame = mysql_query($get_frame) or die(mysql_error());
while($frame_row = mysql_fetch_array($result_frame)) {
$frame_quantity = $frame_row['aantal'];
$get_attribute = "SELECT * FROM shop_product_attribute WHERE ean13 = '$ean13' AND upc = '$framesize' ";
$result_attribute = mysql_query($get_attribute) or die(mysql_error());
while($attribute_row = mysql_fetch_array($result_attribute)) {
$attribute_id = $attribute_row['id_product_attribute'];
echo 'EAN13:'.$ean13.' FRAMESIZE:'.$framesize.' ATTRIBUTE_ID:'.$attribute_id.' FRAMEQUANTITY:'.$frame_quantity.'<br />';
mysql_query("UPDATE shop_stock_available SET quantity='$frame_quantity' WHERE id_product_attribute = '$attribute_id'")
or die(mysql_error());
}
}
}
?>
Gewijzigd op 18/12/2014 20:53:54 door Jaimy A
Om te beginnen gaan we de aantallen in één keer ophalen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
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
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
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
Gewijzigd op 18/12/2014 22:23:42 door Ger van Steenderen
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 ?
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?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)) { }
?>
$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
Gewijzigd op 19/12/2014 12:48:31 door Jaimy A
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 ....
Gewijzigd op 23/12/2014 22:25:04 door Jaimy A