praegune kellaaeg 04.11.2025 14:55:22 
 |  
 
| 
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
 |  
 |  
| autor | 
 |  
Cemtey 
HV kasutaja 
 
  
liitunud: 04.03.2008 
 
 
 
 
  | 
 
24.01.2012 02:33:38
.. kustutatud .. | 
    
 | 
 
  | 
 
.. kustutatud ..
  viimati muutis Cemtey 23.04.2014 00:08:00, muudetud 1 kord | 
 
  | 
 
	
		
			
			
				| Kommentaarid: 18 loe/lisa | 
				Kasutajad arvavad: | 
				    | 
				 :: | 
				  0 :: | 
				  0 :: | 
				  17 | 
			 
			 
		 | 
	 
| tagasi üles | 
 | 
 
  | 
 
riaak 
HV Guru 
 
  
liitunud: 21.09.2002 
 
 
 
  
  | 
 
24.01.2012 10:17:10
 | 
    
 | 
 
  | 
 
Tee vaade:
 
	
	  CREATE VIEW v_labisoidud AS
 
SELECT id AS x, kilometraaz, kilometraaz - (SELECT kilometraaz FROM tabel WHERE id = (x-1)) FROM tabel; | 
 
 
 _________________ ¯\_(ツ)_/¯ | 
 
  | 
 
	
		
			
			
				| Kommentaarid: 119 loe/lisa | 
				Kasutajad arvavad: | 
				    | 
				 :: | 
				  0 :: | 
				  1 :: | 
				  105 | 
			 
			 
		 | 
	 
| tagasi üles | 
 | 
 
  | 
 
Fukiku 
Kreisi kasutaja 
 
  
liitunud: 06.11.2003 
 
 
 
 
  | 
 
24.01.2012 11:26:27
 | 
    
 | 
 
  | 
 
Kas sul on seal tabelis ainult ühe sõiduki andmed ja sa garanteerid mingil moel, et ükski id väärtus vahelt puudu ei jää? Pigem oleks mõistlik lahendus tekitada lisaveerg prev_id ja sinna ise eelmise kirje id salvestada uue kirje lisamisel, et tagada süsteemi töökindlus. Mitme sõiduki korral peaksid sa nii ehk nii seda tegema, sest siis ei ole millegagi tagatud sama sõiduki puhul id väärtuste järgnevus. 
 
 
Iseenesest view tekitamise soovitus on aga väga hea - saaksid kõik andmed ühe päringuga kätte, selmet teha mitukümmend eraldi SQL päringut, mis igaüks ühe rea tagastavad.
 _________________ Foxic is just a simple fox
 
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist. | 
 
  | 
 
	
		
			
			
				| Kommentaarid: 2 loe/lisa | 
				Kasutajad arvavad: | 
				    | 
				 :: | 
				  0 :: | 
				  0 :: | 
				  2 | 
			 
			 
		 | 
	 
| tagasi üles | 
 | 
 
  | 
 
serk 
HV kasutaja 
 
liitunud: 24.05.2003 
 
 
 
 
  | 
 
24.01.2012 12:47:38
 | 
    
 | 
 
  | 
 
Esialgne lahendus on porno.
 
 
Olenevalt andmebaasist ja versioonist, saad kasutada analüütilisi funktsioone(analytical functions) väärtuste toomiseks eelmiselt realt. Googelda natuke. MySQLis on samuti lahendused olemas.
 | 
 
  | 
 
	
		
			
			
				| Kommentaarid: 8 loe/lisa | 
				Kasutajad arvavad: | 
				    | 
				 :: | 
				  1 :: | 
				  0 :: | 
				  7 | 
			 
			 
		 | 
	 
| tagasi üles | 
 | 
 
  | 
 
andrusny 
Kreisi kasutaja 
 
  
liitunud: 20.03.2006 
 
 
 
 
  | 
 
24.01.2012 14:05:05
 | 
    
 | 
 
  | 
 
Sa ajad asja kole keerukaks, milleks hakata lõpust, milleks id?
 
Võtad järjest algusest, paned eelmise  rea lisamuutujasse lahutad antud reast.
 
 
	
	  
 
         echo "<table border='1' cellpadding='10'>"; 
 
         echo "<tr> <th>labisõit</th></tr>"; 
 
     include('connect-db.php');
 
    $read = mysql_query("SELECT * FROM tabel") ;
 
   $eelmine=0;
 
        while($pw = mysql_fetch_array( $read )) {  
 
         $kokku = $pw['kilometraaz'] - $eelmine; 
 
               echo '<tr><td>'.$pw['kilometraaz'].'</td><td>' . $kokku. ' </td></tr>'; 
 
              
 
          $eelmine =   $pw['kilometraaz'] ;
 
         } 
 
echo '</table>'; | 
 
 
 _________________
   | 
 
  | 
 
	
		
			
			
				| Kommentaarid: 7 loe/lisa | 
				Kasutajad arvavad: | 
				    | 
				 :: | 
				  0 :: | 
				  0 :: | 
				  7 | 
			 
			 
		 | 
	 
| tagasi üles | 
 | 
 
  | 
 
andresv 
HV kasutaja 
 
liitunud: 05.12.2004 
 
 
 
  
  | 
 | 
 
	
		
			
			
				| Kommentaarid: 5 loe/lisa | 
				Kasutajad arvavad: | 
				    | 
				 :: | 
				  0 :: | 
				  0 :: | 
				  5 | 
			 
			 
		 | 
	 
| tagasi üles | 
 | 
 
  | 
 
serk 
HV kasutaja 
 
liitunud: 24.05.2003 
 
 
 
 
  | 
 
24.01.2012 20:45:28
 | 
    
 | 
 
  | 
 
Tegin kiirelt ühe näite(ei meeldi mulle äriloogika koodis ja kasutaks ikka andmebaasi maksimaalselt ära).
 
 
Tabel:
 
CREATE TABLE IF NOT EXISTS `emp` (
 
  `id` int(11) NOT NULL AUTO_INCREMENT,
 
  `auto_id` int(11) NOT NULL,
 
  `kilometraaz` int(11) NOT NULL,
 
  PRIMARY KEY (`id`)
 
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
 
 
--
 
-- Daten für Tabelle `emp`
 
--
 
 
INSERT INTO `emp` (`id`, `auto_id`, `kilometraaz`) VALUES
 
(1, 1, 100),
 
(2, 1, 200),
 
(3, 1, 400),
 
(4, 1, 1400),
 
(5, 2, 3000),
 
(6, 2, 6000);
 
 
Päring:
 
SELECT auto_id, kilometraaz, kilometraaz - if( @rida= auto_id, @eelmine+ least( 0, @eelmine:= kilometraaz ) , least( 0, @rida:= auto_id )+ least( 0, @eelmine:= kilometraaz )+ kilometraaz ) labisoit
 
FROM (
 
 
SELECT @rida:=0, @eelmine:=0
 
)r, emp t
 
ORDER BY auto_id DESC , kilometraaz ASC 
 
 
Tulemus:
 
auto_id kilometraaz labisoit 
 
2          3000           0 
 
2          6000          3000 
 
1          100            0 
 
1          200            100 
 
1          400            200 
 
1          1400          1000
 
 
Süviti pole testinud, võibolla mingitel hetkedel kalab.
 
 
 
	  | riaak kirjutas: | 
	 
	
	  Tee vaade:
 
	
	  CREATE VIEW v_labisoidud AS
 
SELECT id AS x, kilometraaz, kilometraaz - (SELECT kilometraaz FROM tabel WHERE id = (x-1)) FROM tabel; | 
 
 
 | 
 
 
 
 
See näide samuti üsna halb. Tekivad sõltuvad alampäringud. SELECT lauses tuuakse väärtused, mitte ei minda tegema uut päringut. Lisaks ei saa sa garanteerida, et id veerg muutub täpselt 1 võrra koguaeg ja et gape ei oleks.
 
 
Lg. Priit Serk
  viimati muutis serk 24.01.2012 21:33:26, muudetud 2 korda | 
 
  | 
 
	
		
			
			
				| Kommentaarid: 8 loe/lisa | 
				Kasutajad arvavad: | 
				    | 
				 :: | 
				  1 :: | 
				  0 :: | 
				  7 | 
			 
			 
		 | 
	 
| tagasi üles | 
 | 
 
  | 
 
andrusny 
Kreisi kasutaja 
 
  
liitunud: 20.03.2006 
 
 
 
 
  | 
 
24.01.2012 20:50:28
 | 
    
 | 
 
  | 
 
	  | tsitaat: | 
	 
	
	  | väärtuste toomisega üle funktsiooni(veel aeglasem) | 
 
 
 
Mõtled minu näidet? Kas tõesti ühe muutuja väärtustamine on sedavõrd ajakulukas? Mingeid topelt päringuid mul ju pole. Kas tahd öelda, et andmebaasi sisene sama loogika on kiirem kui otse väljapritsimisel teostatav?
 _________________
   | 
 
  | 
 
	
		
			
			
				| Kommentaarid: 7 loe/lisa | 
				Kasutajad arvavad: | 
				    | 
				 :: | 
				  0 :: | 
				  0 :: | 
				  7 | 
			 
			 
		 | 
	 
| tagasi üles | 
 | 
 
  | 
 
serk 
HV kasutaja 
 
liitunud: 24.05.2003 
 
 
 
 
  | 
 
24.01.2012 21:05:19
 | 
    
 | 
 
  | 
 
	  | andrusny kirjutas: | 
	 
	
	  
	  | tsitaat: | 
	 
	
	  | väärtuste toomisega üle funktsiooni(veel aeglasem) | 
 
 
 
Mõtled minu näidet? Kas tõesti ühe muutuja väärtustamine on sedavõrd ajakulukas? Mingeid topelt päringuid mul ju pole. Kas tahd öelda, et andmebaasi sisene sama loogika on kiirem kui otse väljapritsimisel teostatav? | 
 
 
 
 
Ma pole MySQLis niivõrd kodus, aga andmebaasid üldjuhul omavad erinevaid mootoreid SQLi ja siis funktsionaalse koodi käivitamiseks. Oracles näiteks SQL engine ja PL/SQL engine. Kasutades päringus SELECT osas pl/sql funktsioone, toimub IGAL REAL switch SQL ja PL/SQL enginei vahel. 10 reaga pole vahet, 1000 reaga pole ka suurt vahet, aga kui select toob juba rohkem ridasi, siis tuleb mitme kordne kiiruse vahe sisse.
 
 
Sinu näide on ok, see ei ole väärtuste toomine üle funktsiooni. Teed ju select * fromi ning PHPs lahutad väärtused. Ehk äriloogika on viidud PHPsse. Lihtsalt teema algatajal oli vaja ka INSERT kohe teha(nagu aru sain) ja selleks PHP lahendus hästi ei sobi. Selleks on parim siiski INSERT INTO ... SELECT 
 
 
Seda mida MySQL engine minu näitega täpselt teeb ja kuidas ta seda tõlgendab, proovin lähipäevil järgi uurida. Pole hetkel kohe käepärast vajalikke vahendeid. Kui kellelgi aega ja viitsimist, laske päring käima miljoni rea peal ja vaatame mis performance ütleb vs teised lahendused. Testimises peitub sageli tõde   
 
 
Lg. Priit Serk
 | 
 
  | 
 
	
		
			
			
				| Kommentaarid: 8 loe/lisa | 
				Kasutajad arvavad: | 
				    | 
				 :: | 
				  1 :: | 
				  0 :: | 
				  7 | 
			 
			 
		 | 
	 
| tagasi üles | 
 | 
 
  | 
 
Cemtey 
HV kasutaja 
 
  
liitunud: 04.03.2008 
 
 
 
 
  | 
 
25.01.2012 10:52:00
 | 
    
 | 
 
  | 
 
.. kustutatud ..
  viimati muutis Cemtey 23.04.2014 00:08:20, muudetud 1 kord | 
 
  | 
 
	
		
			
			
				| Kommentaarid: 18 loe/lisa | 
				Kasutajad arvavad: | 
				    | 
				 :: | 
				  0 :: | 
				  0 :: | 
				  17 | 
			 
			 
		 | 
	 
| tagasi üles | 
 | 
 
  | 
 
serk 
HV kasutaja 
 
liitunud: 24.05.2003 
 
 
 
 
  | 
 
25.01.2012 14:40:08
 | 
    
 | 
 
  | 
 
Kuidas ei tööta, mul küll töötab?
 
	
	  
 
<?php
 
$sql = "SELECT auto_id, kilometraaz, kilometraaz - if( @rida= auto_id, @eelmine+ least( 0, @eelmine:= kilometraaz ) , least( 0, @rida:= auto_id )+ least( 0, @eelmine:= kilometraaz )+ kilometraaz ) labisoit \n"
 
     . "FROM ( \n"
 
     . "\n"
 
     . "SELECT @rida:=0, @eelmine:=0 \n"
 
     . ")r, emp t \n"
 
     . "ORDER BY auto_id DESC , kilometraaz ASC LIMIT 0, 30 ";
 
    
 
    
 
$con = mysql_connect("localhost","root","");
 
 if (!$con)
 
   {
 
   die('Could not connect: ' . mysql_error());
 
   }
 
 
 
mysql_select_db("test", $con);
 
 
 
$result = mysql_query($sql);
 
 
 
while($row = mysql_fetch_array($result))
 
   {
 
   echo $row['auto_id'] . " " . $row['labisoit'];
 
   echo "<br />";
 
   }
 
 
 
mysql_close($con);
 
    ?>
 
 | 
 
 
 
 
Kopeerimisel tekkisid SQL lausesse mingid lollakad sümbolid, ei viitsi neid eemaldada. Tee nii et PhpMyAdminnis käivitad selecti ja seal on nupp mis genereerib sulle PHP koodi(Kasutan versiooni phpMyAdmin Versionsinformationen: 3.4.5). 
 
 
Kui sul vaja ka kohe insert into teha, siis teedki PhpMyAdminnis valmis SQL lause: insert into (veerud) SELECT ..., käivitad ja vajutad nuppu loo PHP kood ja selle copy pasted endale otse php scripti.
 
 
Lisaks loe natuke:
 
http://dev.mysql.com/doc/refman/5.1/en/stored-routines.html
 
 
Edu
 
 
Lg. Priit Serk
 | 
 
  | 
 
	
		
			
			
				| Kommentaarid: 8 loe/lisa | 
				Kasutajad arvavad: | 
				    | 
				 :: | 
				  1 :: | 
				  0 :: | 
				  7 | 
			 
			 
		 | 
	 
| tagasi üles | 
 | 
 
  | 
 
 | 
 
 
|  lisa lemmikuks | 
 | 
 
    | 
sa ei või postitada uusi teemasid siia foorumisse sa ei või vastata selle foorumi teemadele sa ei või muuta oma postitusi selles foorumis sa ei või kustutada oma postitusi selles foorumis sa ei või vastata küsitlustele selles foorumis sa ei saa lisada manuseid selles foorumis sa võid manuseid alla laadida selles foorumis
  |  
 
 | 
 
 
 
  
Hinnavaatlus ei vastuta foorumis tehtud postituste eest. 
 |