Hoe kan dit korter en sneller?
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
public function getReservedVoorraad($id,$filiaal){
$qArtikelen = $this->_db->query("SELECT * FROM artikelen WHERE id='".$this->_db->escape($id)."'");
$sArtikel = $this->_db->fetchAssoc($qArtikelen);
$qUitrol = $this->_db->query("SELECT * FROM uitrol WHERE filiaal='".$this->_db->escape($filiaal)."' AND verwijderd!='1' AND ok!='1'");
$nProducten = 0;
while($sUitrol = $this->_db->fetchAssoc($qUitrol)){
$qProducten = $this->_db->query("SELECT * FROM uitrol_producten WHERE uitrol='".$this->_db->escape($sUitrol['id'])."' AND artikel='".$this->_db->escape($id)."' AND verwijderd!='1'");
$nProducten += $this->_db->numRows($qProducten);
}
$qMonteurs = $this->_db->query("SELECT * FROM monteurs_prod WHERE artikel='".$this->_db->escape($id)."' AND filiaal='".$this->_db->escape($filiaal)."' AND ok!='1'");
while($monteurs = $this->_db->fetchAssoc($qMonteurs)){
$nProducten += $monteurs['aantal'];
}
if($filiaal == 'ESL'){
$nProducten = $nProducten + $sArtikel['extra_ESB'] + $sArtikel['extra_ESR'];
}
return $nProducten;
}
?>
public function getReservedVoorraad($id,$filiaal){
$qArtikelen = $this->_db->query("SELECT * FROM artikelen WHERE id='".$this->_db->escape($id)."'");
$sArtikel = $this->_db->fetchAssoc($qArtikelen);
$qUitrol = $this->_db->query("SELECT * FROM uitrol WHERE filiaal='".$this->_db->escape($filiaal)."' AND verwijderd!='1' AND ok!='1'");
$nProducten = 0;
while($sUitrol = $this->_db->fetchAssoc($qUitrol)){
$qProducten = $this->_db->query("SELECT * FROM uitrol_producten WHERE uitrol='".$this->_db->escape($sUitrol['id'])."' AND artikel='".$this->_db->escape($id)."' AND verwijderd!='1'");
$nProducten += $this->_db->numRows($qProducten);
}
$qMonteurs = $this->_db->query("SELECT * FROM monteurs_prod WHERE artikel='".$this->_db->escape($id)."' AND filiaal='".$this->_db->escape($filiaal)."' AND ok!='1'");
while($monteurs = $this->_db->fetchAssoc($qMonteurs)){
$nProducten += $monteurs['aantal'];
}
if($filiaal == 'ESL'){
$nProducten = $nProducten + $sArtikel['extra_ESB'] + $sArtikel['extra_ESR'];
}
return $nProducten;
}
?>
*BUMP*
Misschien iemand anders?
Kun je misschien het wat duidelijker maken? Hoe zien je tabelen er bijv. uit en wat wil je hebben aan de hand van wat. Ik ben ook geen SQL ster, maar dan zou ik nog een gok kunnen wagen (om vervolgens overladen te worden met nuttige tips van Ger of Erwin :-)
database normaliseren. ik zie zo snel twee tabellen met producten. even doorgaan en je komt al snel uit op eenvoudige queries
Ik wil nu graag weten hoeveel artikelen er gereserveerd staan (dus in een uitrol of voor een monteur).
Op deze manier werkt hij wel, alleen erg traag.
Ik hoop dat het zo wat duidelijker is.
Gewijzigd op 08/11/2012 21:28:20 door John D
Iemand nog een idee hoe ik dit sneller kan maken?
Misschien door de * te vervangen door kolommen?
Normaliseren is inderdaad echt de beste oplossing, maar als tussenoplossing kun je SELECT COUNT(*) gebruiken in plaats van SELECT * omdat je functie eigenlijk alleen telt.
Bo Ter Ham op 09/11/2012 19:51:58:
Misschien door de * te vervangen door kolommen?
Scheelt niet veel helaas. Toch bedankt.
Ward van der Put op 09/11/2012 19:58:12:
Normaliseren is inderdaad echt de beste oplossing.
Kan ik nu nog de database normaliseren terwijl het systeem vol in gebruik is?
En dan van harte lust aanpassen.
Wil je alles met SQL blijven doen: geen nieuwe database, wel allemaal nieuwe tabellen (desnoods met een prefix).
En dan met wat queries (in phpMyAdmin oid) kopieren.
De oude meuk weggooien (of weg-prefixen) en de nieuwe zooi goed noemen.
En dat terwijl je de aangepaste PHP ook op de FTP gooit.
Dat kan in een uurtje, mist je alles goed voorbereid. Wel even een uurtje 'niet beschikbaar', maar dat is nachtwerk.
Toevoeging op 10/11/2012 09:17:50:
Probeer dit anders eens...
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
30
31
32
33
34
35
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
30
31
32
33
34
35
<?php
public function getReservedVoorraad($id, $filiaal)
{
// selecteer het aantal producten die fout zijn (niet-verwijderd en niet-ok)
$sql = " SELECT COUNT(id) AS aantal
FROM uitrol_producten AS up
LEFT JOIN uitrol AS u
ON u.id = up.uitrol
WHERE filiaal = '".$this -> _db -> escape($filiaal)."'
AND u.verwijderd != 1
AND u.ok != 1
AND up.verwijderd != 1
AND up.ok != 1
";
// voer query uit
$producten = $this -> _db -> query($sql);
$producten = $this->_db_fetchAssoc($producten);
$producten = $producten['aantal'];
if($filiaal == 'ESL')
{
$sql = " SELECT extra_ESB, extra_ESR
FROM artikelen
WHERE id = " . $this -> _db -> escape($id) . "
";
$artikelen = $this -> _db -> query($sql);
$artikelen = $this -> _db -> fetchAssoc($artikelen);
$producten = $producten + $artikelen['extra_ESB'] + $artikelen['extra_ESR'];
}
return $producten;
}
?>
public function getReservedVoorraad($id, $filiaal)
{
// selecteer het aantal producten die fout zijn (niet-verwijderd en niet-ok)
$sql = " SELECT COUNT(id) AS aantal
FROM uitrol_producten AS up
LEFT JOIN uitrol AS u
ON u.id = up.uitrol
WHERE filiaal = '".$this -> _db -> escape($filiaal)."'
AND u.verwijderd != 1
AND u.ok != 1
AND up.verwijderd != 1
AND up.ok != 1
";
// voer query uit
$producten = $this -> _db -> query($sql);
$producten = $this->_db_fetchAssoc($producten);
$producten = $producten['aantal'];
if($filiaal == 'ESL')
{
$sql = " SELECT extra_ESB, extra_ESR
FROM artikelen
WHERE id = " . $this -> _db -> escape($id) . "
";
$artikelen = $this -> _db -> query($sql);
$artikelen = $this -> _db -> fetchAssoc($artikelen);
$producten = $producten + $artikelen['extra_ESB'] + $artikelen['extra_ESR'];
}
return $producten;
}
?>
Je returned je monteurs niet, dus dat kan je net zo goed weghalen.
Probeert correct in te springen (deze code heb ik handmatig gedaan, maar even een formatter erover doet soms wonderen.
Selecteer alleen wat je nodig hebt: het aantal doe je dus met COUNT().
Bij integers (als $id) gebruik je GEEN enkele haakjes in je query.
Het zou kunnen dat hij wat raar doet met die 4 AND ok != 1, maar zonder jouw tabellen-structuur is het voor mij ook wat gissen.
Gewijzigd op 10/11/2012 09:18:21 door Eddy E