2017-05-19 1 views
0

Also versuche ich einen Weg zu finden, diesen Code zu minimieren. In der Spitze bekomme ich das aktuelle Jahr.Wie vereinfacht man die MySQL-Abfrage für Diagrammdaten?

//Get the current year 
$theYear = date("Y", strtotime($day)); 
    if(isset($_POST['theYear'])){ 
     $theYear = $_POST['year_select']; 
} 

Weiter unten Ich erhalte die Summe der Stunden für jede Woche des Jahres. Mein Code hat alle 53 Wochen, aber ich habe gerade 10 als Referenz gegriffen. Es ist wie folgt eingerichtet.

$week01 = mysqli_query($con, "SELECT SUM(hours) AS tHours01 FROM timecard WHERE YEARWEEK(date, 1) = '".$theYear."01'"); 
$week02 = mysqli_query($con, "SELECT SUM(hours) AS tHours02 FROM timecard WHERE YEARWEEK(date, 1) = '".$theYear."02'"); 
$week03 = mysqli_query($con, "SELECT SUM(hours) AS tHours03 FROM timecard WHERE YEARWEEK(date, 1) = '".$theYear."03'"); 
$week04 = mysqli_query($con, "SELECT SUM(hours) AS tHours04 FROM timecard WHERE YEARWEEK(date, 1) = '".$theYear."04'"); 
$week05 = mysqli_query($con, "SELECT SUM(hours) AS tHours05 FROM timecard WHERE YEARWEEK(date, 1) = '".$theYear."05'"); 
$week06 = mysqli_query($con, "SELECT SUM(hours) AS tHours06 FROM timecard WHERE YEARWEEK(date, 1) = '".$theYear."06'"); 
$week07 = mysqli_query($con, "SELECT SUM(hours) AS tHours07 FROM timecard WHERE YEARWEEK(date, 1) = '".$theYear."07'"); 
$week08 = mysqli_query($con, "SELECT SUM(hours) AS tHours08 FROM timecard WHERE YEARWEEK(date, 1) = '".$theYear."08'"); 
$week09 = mysqli_query($con, "SELECT SUM(hours) AS tHours09 FROM timecard WHERE YEARWEEK(date, 1) = '".$theYear."09'"); 
$week10 = mysqli_query($con, "SELECT SUM(hours) AS tHours10 FROM timecard WHERE YEARWEEK(date, 1) = '".$theYear."10'"); 

Ich versuchte, eine while-Schleife zu tun, fand aber, es war zu viele Schichten von PHP, um richtig zu arbeiten. Also wiederholte ich eine while-Schleife, um mir die unten stehenden Abfragen zu geben und kopierte dann in meinen Code.

Unter dem obigen Code greife ich auch alle Daten und verwendete die gleiche Methode wie oben, um die Codeausgabe zu wiederholen.

$Total01 = mysqli_fetch_object($week01); 
$Total02 = mysqli_fetch_object($week02); 
$Total03 = mysqli_fetch_object($week03); 
$Total04 = mysqli_fetch_object($week04); 
$Total05 = mysqli_fetch_object($week05); 
$Total06 = mysqli_fetch_object($week06); 
$Total07 = mysqli_fetch_object($week07); 
$Total08 = mysqli_fetch_object($week08); 
$Total09 = mysqli_fetch_object($week09); 
$Total10 = mysqli_fetch_object($week10); 

Also dann all diese Daten werden in einer Tabelle in Zellen hallen und dann in eine grafischen Darstellung umgewandelt, aber nur, wenn es Stunden für die Woche waren. So ist der Graph wächst wie wir Stunden für zukünftige Wochen einloggen stattdessen einen großen leeren Raum auf der rechten Seite am Anfang des Jahres mit und füllt es langsam in.

<? if(($Total01->tHours01) > 0) { ?><td><? if(empty($Total01->tHours01)){echo '0';}else{ echo $Total01->tHours01;}?></td><? } ?> 
<? if(($Total02->tHours02) > 0) { ?><td><? if(empty($Total02->tHours02)){echo '0';}else{ echo $Total02->tHours02;}?></td><? } ?> 
<? if(($Total03->tHours03) > 0) { ?><td><? if(empty($Total03->tHours03)){echo '0';}else{ echo $Total03->tHours03;}?></td><? } ?> 
<? if(($Total04->tHours04) > 0) { ?><td><? if(empty($Total04->tHours04)){echo '0';}else{ echo $Total04->tHours04;}?></td><? } ?> 
<? if(($Total05->tHours05) > 0) { ?><td><? if(empty($Total05->tHours05)){echo '0';}else{ echo $Total05->tHours05;}?></td><? } ?> 
<? if(($Total06->tHours06) > 0) { ?><td><? if(empty($Total06->tHours06)){echo '0';}else{ echo $Total06->tHours06;}?></td><? } ?> 
<? if(($Total07->tHours07) > 0) { ?><td><? if(empty($Total07->tHours07)){echo '0';}else{ echo $Total07->tHours07;}?></td><? } ?> 
<? if(($Total08->tHours08) > 0) { ?><td><? if(empty($Total08->tHours08)){echo '0';}else{ echo $Total08->tHours08;}?></td><? } ?> 
<? if(($Total09->tHours09) > 0) { ?><td><? if(empty($Total09->tHours09)){echo '0';}else{ echo $Total09->tHours09;}?></td><? } ?> 
<? if(($Total10->tHours10) > 0) { ?><td><? if(empty($Total10->tHours10)){echo '0';}else{ echo $Total10->tHours10;}?></td><? } ?> 

Das alles funktioniert gut und schön, aber ich bin neugierig Wenn es einen Weg gibt, etwas zu tun, was mir nicht bewusst ist?

+0

„zu viele Schichten von PHP richtig zu arbeiten“ - was bedeutet das? Es hört sich so an, als hättest du die while-Schleife nicht richtig geschrieben. Vielleicht sollte deine Frage lauten: "Was ist mit dieser While-Schleife?". Dies scheint wahrscheinlich eine Hausaufgabe zu sein, deshalb werde ich nicht zu viele Details geben, aber ich würde vorschlagen, einen Blick darauf zu werfen, wie der Befehl SQL 'group by' funktioniert. – DaveyDaveDave

+0

@DaveyDaveDave Ok, so, wenn ich sagte, dass, was ich meinte war ich eine While-Schleife Setup hatte und es würde alles tun, was ich es wie Ausdrucken den gesamten Code, aber die Seite nicht ausgeführt werden, den Code tun wollte, nachdem sie bereits hatten Führe die while-Schleife aus. Ich bin mir sicher, dass dies nicht viel mehr Sinn macht, aber ich habe Schwierigkeiten zu beschreiben, was ich meine. edit: Der Versuch, Return zu treffen und es reicht nur den Kommentar. Auch dies ist ein Projekt, das ich auf der Seite machte die manuelle Arbeit Feld, um zu versuchen und zu entkommen und in der Programmierung zu erhalten. Also nicht gerade Hausaufgaben. – Dustin

Antwort

0

Um die Anzahl der Anfragen an die Datenbank zu reduzieren, können Sie kompliziertere Abfragen erstellen, die alle benötigten Daten abrufen und dann richtig rendern.

Wenn die Diagrammdaten kontinuierlich sein müssen, müssen alle möglichen Wochenwerte vorhanden sein.
Um die Folge von fortlaufenden Nummern zu generieren, können mehrere Ansätze ausgewählt werden. Einige von ihnen benötigen eine neue Tabellengenerierung, während andere die Sequenz ohne direkte Tabellenmanipulation erzeugen können. This answer hilft bei dieser Aufgabe.

So, lassen Sie uns den Bereich der Woche Nummern auswählen, um anzuzeigen. Es könnte leicht von 1 bis 53 oder etwas anderes sein. Für das Beispiel der Abfrage, lassen Sie sie von 20 bis 35 sein und Grundwert für diese Wochen wird 0 Stunden gearbeitet.

# SEQUENCE OF WEEK NUMBERS NEEDED 
SELECT (SELECT 0) AS tHours, (t*10+u+1) AS tWeek FROM 
(SELECT 0 t UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION 
SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) A, 
(SELECT 0 u UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION 
SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) B 
HAVING tWeek BETWEEN 20 AND 35; 

Auch brauchen wir Stunden, um ein Datum über den tatsächlichen Betrag erhalten Arbeits pro Woche.
, die leicht mit Hilfe der folgenden Abfrage getan werden könnte:

# WEEKLY HOURS; 
SELECT SUM(hours) AS tHours, WEEK(date, 1) AS tWeek 
FROM timecard 
WHERE YEARWEEK(date, 1) BETWEEN 200920 AND 200935 
GROUP BY YEARWEEK(date, 1); 

Also alle Daten wir vorherigen Anfragen kombinieren erforderlich zu bekommen, und sie werden im folgenden Beispiel wie folgt aussehen:

# RESULT QUERY 
SELECT SUM(tHours) AS tHours, tWeek 
FROM 
    ((SELECT SUM(hours) AS tHours, WEEK(date, 1) AS tWeek 
     FROM timecard 
     WHERE YEARWEEK(date, 1) BETWEEN 200920 AND 200935 
     GROUP BY YEARWEEK(date, 1)) 
    UNION 
    (SELECT (SELECT 0) AS tHours, (t*10+u+1) AS tWeek FROM 
     (SELECT 0 t UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION 
     SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) A, 
     (SELECT 0 u UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION 
     SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) B 
     HAVING tWeek BETWEEN 20 AND 35 
    ORDER BY tWeek)) data 
GROUP BY tWeek; 

Diese Beispiele mit dem resultierenden Ausgang werden bereitgestellt here.

Der nächste Schritt wird sein, diese Abfrage von Ihrem Skript auszuführen und die Ergebnisse zu rendern.
Ich habe eine Weile nicht mit PHP gearbeitet, es tut mir leid, wenn der Code unordentlich wird. Ich werde versuchen, Beispielcode einfach zu schreiben, um Ihnen zu zeigen, wie Sie mit den Ergebnissen arbeiten können.

Nehmen wir an, Sie haben bereits $theYear Variable.
Der nächste Schritt besteht darin, den Bereich der anzuzeigenden Wochennummern auszuwählen.

$startWeek = 20; 
$endWeek = 35; 

Abfrage Objekt wird so aussehen:

$query = "SELECT SUM(tHours) AS tHours, tWeek ". 
"FROM ". 
    "((SELECT SUM(hours) AS tHours, WEEK(date, 1) AS tWeek ". 
     "FROM timecard ". 
     "WHERE YEARWEEK(date, 1) BETWEEN ". 
     $theYear.$startWeek." AND ". 
     $theYear.$endWeek." ". 
     "GROUP BY YEARWEEK(date, 1)) ". 
    "UNION ". 
    "(SELECT (SELECT 0) AS tHours, (t*10+u+1) AS tWeek FROM ". 
     "(SELECT 0 t UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION ". 
     "SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) A, ". 
     "(SELECT 0 u UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION ". 
     "SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) B ". 
     "HAVING tWeek BETWEEN ".$startWeek." AND ".$endWeek." ". 
    "ORDER BY tWeek)) data ". 
"GROUP BY tWeek"; 

nächster logischer Schritt ist es, die Daten aus der Datenbank zu erhalten:

$weeks = mysqli_query($con, $query); 

Und wir brauchen die Ergebnisse schließlich zu machen, Dies kann auf mehrere Arten erfolgen, zum Beispiel:

while ($row = mysqli_fetch_array($weeks, MYSQLI_ASSOC)) { 
    $result = "<td>".$row['tHours']."</td>"; // $row['tWeek'] also can be rendered 
    echo $result; 
} 

Dieser Ansatz bietet also die Möglichkeit, die Anzahl der Datenbankanforderungen erheblich zu reduzieren, die Gesamtleistung zu erhöhen und die Antwortzeit Ihrer Anwendung zu verkürzen. Auch die Reichweite der Wochen kann variieren, indem einfach die entsprechenden Variablen geändert werden.
Der Code ist weniger mit unnötigen Variablen verschmutzt, obwohl SQL-Anfrage wurde komplizierter.

Dieser Code könnte auf verschiedene Arten anders geschrieben werden, und möglicherweise gibt es einen Platz für weitere Verbesserungen. Also habe ich einfach meinen Standpunkt geteilt und deiner kann davon abweichen.

Vielen Dank für das Lesen.