heavyaris Δημοσ. 16 Φεβρουαρίου 2011 Δημοσ. 16 Φεβρουαρίου 2011 Καλημέρα, θα ήθελα να σχεδιάσω ένα πινακάκι σαν αυτά τα 2: http://www.kerdoskopos.com/bet_15/tameio----bet-stats.html το πρώτο "Overall Statistics" είναι για όλα τα έτη, από την στιγμή που τρέχει η ιστοσελίδα, το έχω κάνει ήδη. αυτό που με "ψαρώνει" είναι το δεύτερο. Ας τα πάρουμε τα πράματα όμως ένα-ένα, στο πεδίο επιλογής έτους καταλαβαίνω ότι πρέπει να κάνω select distinct απο την βάση, αλλά το πεδίο της mysql είναι date, πχ 2009-12-31. Πως θα μπορούσα να πάρω μόνο το έτος; ευχαριστώ
spartakoscs Δημοσ. 16 Φεβρουαρίου 2011 Δημοσ. 16 Φεβρουαρίου 2011 > <?php echo strftime("%Y", strtotime("2009-12-31")); ?> η εννοείς πως θα βρεις τις έγραφες για το 2009 ?
heavyaris Δημοσ. 16 Φεβρουαρίου 2011 Μέλος Δημοσ. 16 Φεβρουαρίου 2011 εγώ έχω εγγραφές στη βάση απο το 2008 έως σήμερα και για όλη την διάρκεια ζωής της ιστοσελίδας, όπως και στο παράδειγμα θα ήθελα το drop down να βγάζει μόνο το έτος. αυτό που ρωτάς θα είναι το δέυτερο στάδιο, απλά πρώτα ξεκίνησα να ρωτήσω για το drop down. ευχαριστω.
spartakoscs Δημοσ. 16 Φεβρουαρίου 2011 Δημοσ. 16 Φεβρουαρίου 2011 >mysql_query("SELECT * FROM yourtable WHERE YEAR(date_record) ='2009'") αυτο ? η >echo 'Year : <select name="dropdown">'; for($i=2005;$i<=date('Y');$i++){ echo '<option value="'.$i.'">'.$i.'</option>'; } echo '</select>';
heavyaris Δημοσ. 16 Φεβρουαρίου 2011 Μέλος Δημοσ. 16 Φεβρουαρίου 2011 με ενδιαφέρει το δεύτερο, αλλά όχι να βάζω εγώ της ημερομηνίες ή να γεμίζουν με λούπα, να διαβάζονται απο τα πεδία τις εγγραφής πχ αν είχα 2 πεδία: 2009-31-1 και 2010-25-9 να έβγαζε το drop down 2009,2010
spartakoscs Δημοσ. 16 Φεβρουαρίου 2011 Δημοσ. 16 Φεβρουαρίου 2011 ωραία μπορείς να κάνεις > $min_query = mysql_query("SELECT date_record FROM yourtable ORDER BY date_record LIMIT 1") or die(mysql_error()); $max_query = mysql_query("SELECT date_record FROM yourtable ORDER BY date_record DESC LIMIT 1") or die(mysql_error()); έτσι έχεις την min και max ημερομήνια των εγγραφών σου ! με τα παραπάνω τώρα μπορείς να φτιάξεις την for σου για να βγάλεις αυτό που θες !
heavyaris Δημοσ. 16 Φεβρουαρίου 2011 Μέλος Δημοσ. 16 Φεβρουαρίου 2011 ευχαριστώ πολύ για την απάντηση. λές δηλαδή να πάρω τα 2 άκρα των ημερομηνιών πχ 2008-1-31 και 2013-12-31. και απο αυτά θα βγάλω το drop down έτσι:
spartakoscs Δημοσ. 16 Φεβρουαρίου 2011 Δημοσ. 16 Φεβρουαρίου 2011 > echo 'Year : <select name="dropdown">'; for($i=$max_year;$i>=$min_year;$i--){ echo '<option value="'.$i.'">'.$i.'</option>'; } echo '</select>'; ναι η for σου θα είναι κάπως έτσι !
thanocaster Δημοσ. 16 Φεβρουαρίου 2011 Δημοσ. 16 Φεβρουαρίου 2011 Μπορείς και μόνο με ένα query: > $years = array(); $query = "SELECT date_record FROM yourtable ORDER BY date_record"; // Διαλέγεις όλες τις εγγραφές του πεδίου 'date_record' $result = mysql_query($query); while ($row = mysql_fetch_array($result)){ array_push($row['date_record'], $years); // Φτιάχνεις ένα array με τις εγγραφές αυτές } $years = array_unique($years); // Σβήνεις τις όποιες διπλοεγγραφές (αν έχεις 2 φορές το 2009 το βάζεις μόνο μια φορά στο array) print "<select name='select_year'>"; foreach ($years as $year){ print "<option value='".$year."'>".$year."</option>"; // Βάζεις για option στο select τις χρονιές που έχεις στο array } print "</select>";
heavyaris Δημοσ. 16 Φεβρουαρίου 2011 Μέλος Δημοσ. 16 Φεβρουαρίου 2011 Μπορείς και μόνο με ένα query: > $years = array(); $query = "SELECT date_record FROM yourtable ORDER BY date_record"; // Διαλέγεις όλες τις εγγραφές του πεδίου 'date_record' $result = mysql_query($query); while ($row = mysql_fetch_array($result)){ array_push($row['date_record'], $years); // Φτιάχνεις ένα array με τις εγγραφές αυτές } $years = array_unique($years); // Σβήνεις τις όποιες διπλοεγγραφές (αν έχεις 2 φορές το 2009 το βάζεις μόνο μια φορά στο array) print "<select name='select_year'>"; foreach ($years as $year){ print "<option value='".$year."'>".$year."</option>"; // Βάζεις για option στο select τις χρονιές που έχεις στο array } print "</select>"; ναι, αλλά στο πεδίο δεν έχω μόνο χρονολογία αλλά έτος-μηνα-μερα
thanocaster Δημοσ. 16 Φεβρουαρίου 2011 Δημοσ. 16 Φεβρουαρίου 2011 Με ποια μορφή είναι αποθηκευμένη η ημερομηνία στη βάση; Εσύ θέλεις να πάρεις μόνο το έτος, έτσι;
spartakoscs Δημοσ. 16 Φεβρουαρίου 2011 Δημοσ. 16 Φεβρουαρίου 2011 Μπορείς και μόνο με ένα query: > $years = array(); $query = "SELECT date_record FROM yourtable ORDER BY date_record"; // Διαλέγεις όλες τις εγγραφές του πεδίου 'date_record' $result = mysql_query($query); while ($row = mysql_fetch_array($result)){ array_push($row['date_record'], $years); // Φτιάχνεις ένα array με τις εγγραφές αυτές } $years = array_unique($years); // Σβήνεις τις όποιες διπλοεγγραφές (αν έχεις 2 φορές το 2009 το βάζεις μόνο μια φορά στο array) print "<select name='select_year'>"; foreach ($years as $year){ print "<option value='".$year."'>".$year."</option>"; // Βάζεις για option στο select τις χρονιές που έχεις στο array } print "</select>"; Με 10.000 έγραφες τι θα συμβεί με αυτό τον κώδικα ?
heavyaris Δημοσ. 16 Φεβρουαρίου 2011 Μέλος Δημοσ. 16 Φεβρουαρίου 2011 Με ποια μορφή είναι αποθηκευμένη η ημερομηνία στη βάση; Εσύ θέλεις να πάρεις μόνο το έτος, έτσι; ναι ακριβώς
thanocaster Δημοσ. 16 Φεβρουαρίου 2011 Δημοσ. 16 Φεβρουαρίου 2011 Σε πίνακα με 100.000 εγγραφές μου έκανε περίπου 1.01-1.06 δευτερόλεπτα. Το μέτρησα ως εξής: > /* * Δημιουργώ τον πίνακα entries στη βάση test της MySQL: * +------+------+ * | id | date | * +------+------+ */ Αρχείο που έβαλε 100.000 τυχαίες (από 1900 ως 2011) εγγραφές στον πίνακα 'entries' της βάσης 'test': > <?php // κώδικας που ανοίγει τη βάση for ($i=1; $i<100001; $i++){ mysql_query("INSERT INTO `test`.`entries` (`id`, `date`) VALUES (".$i.", ".rand(1900, 2011).")"); } ?> Αρχείο που έφτιαξε το τελικό dropdown και μέτρησε και το χρόνο εκτέλεσης σε δευτερόλεπτα. Τρέχει τον κώδικα 5 φορές (μπορείς να αλλάξεις και να το τρέξεις όσες φορές θέλεις), και μετράει χρόνους για κάθε τεστ, συνολικό, μέσο χρόνο, αριθμό σειρών και ταχύτητα σε σειρές ανά δευτερόλεπτο: > <?php function getTime() { $timer = explode( ' ', microtime() ); $timer = $timer[1] + $timer[0]; return $timer; } function looptest($e){ $values = array(); $mtime = array(); print "<h1>Running the script $e times:</h1>"; for ($i=1;$i<$e+1;$i++){ $values = test($i); $mtime[$i] = $values['time']; $rows = $values['rows']; } print "<br /><br /><strong>Script time</strong>: ".array_sum($mtime)." sec". "<br /><strong>Average script time</strong>: ".array_sum($mtime)/count($mtime)." sec". "<br /><strong>Parsed</strong>: ".$rows*$e." rows (".$e." times, ".$rows." rows each time)". "<br /><strong>Average speed</strong>: ~".round($rows*$e/array_sum($mtime), 2)." rows per second"; } function test($e){ $start = getTime(); // κώδικας που ανοίγει τη βάση $years = array(); $query = "SELECT * FROM entries ORDER BY date"; // Διαλέγεις όλες τις εγγραφές του πεδίου 'date_record' $result = mysql_query($query); while ($row = mysql_fetch_array($result)){ array_push($years, $row['date']); // Φτιάχνεις ένα array με τις εγγραφές αυτές } $rows = mysql_num_rows($result); mysql_close($link); $years = array_unique($years); // Σβήνεις τις όποιες διπλοεγγραφές (αν έχεις 2 φορές το 2009 το βάζεις μόνο μια φορά στο array) print "<select name='select_year' style='position: relative; float: left; clear: both; margin-right: 2em;'>"; foreach ($years as $year){ print "<option value='".$year."'>".$year."</option>"; // Βάζεις για option στο select τις χρονιές που έχεις στο array } print "</select>"; $end = getTime(); $time = round($end - $start,4); print "<span style='color: #666; font-size: 0.8em; font-style: italic;'><strong>Script time #$e</strong>: $time sec</span><br /><br />"; return array('time' => $time, 'rows' => $rows); } looptest(5); // Δώσε για όρισμα πόσες φορές θέλεις να τρέξει το τεστ ?> Εκδόσεις Apache, PHP, MySQL: > Apache: 2.2.15 PHP: 5.3.3 MySQL: 5.5.8 Χαρακτηριστικά υπολογιστή στον οποίο τρέξανε τα τεστ: > CPU: 2.4 GHz Intel Core 2 Duo RAM: 2Gb 667MHz DDR2 SDRAM OS: Mac OS X 10.6.6
heavyaris Δημοσ. 23 Φεβρουαρίου 2011 Μέλος Δημοσ. 23 Φεβρουαρίου 2011 παιδιά ευχαριστώ, το έκανα με: >SELECT DISTINCT YEAR(date_added) AS year FROM table ORDER BY year ASC
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.