Avaleht
uus teema   vasta Tarkvara »  WWW »  .. kustutatud .. märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
Cemtey
HV kasutaja
Cemtey

liitunud: 04.03.2008




sõnum 24.01.2012 03:33:38 .. kustutatud .. vasta tsitaadiga

.. kustutatud ..

viimati muutis Cemtey 23.04.2014 01:08:00, muudetud 1 kord
Kommentaarid: 18 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 17
tagasi üles
vaata kasutaja infot saada privaatsõnum
riaak
HV Guru
riaak

liitunud: 22.09.2002



Autoriseeritud ID-kaardiga

sõnum 24.01.2012 11:17:10 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 24.01.2012 12:26:27 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
serk
HV kasutaja

liitunud: 24.05.2003




sõnum 24.01.2012 13:47:38 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 24.01.2012 15:05:05 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
andresv
HV kasutaja

liitunud: 06.12.2004



Autoriseeritud ID-kaardiga

sõnum 24.01.2012 16:17:31 vasta tsitaadiga

Kui teed asja enda lõbuks, siis äkki oleks mõistlikum mõnda olemasolevat süsteemi kasutada
nagu näiteks: http://www.spritmonitor.de/en/
http://www.spritmonitor.de/en/detail/257144.html
Kommentaarid: 5 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 5
tagasi üles
vaata kasutaja infot saada privaatsõnum
serk
HV kasutaja

liitunud: 24.05.2003




sõnum 24.01.2012 21:45:28 vasta tsitaadiga

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 22:33:26, muudetud 2 korda
Kommentaarid: 8 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 24.01.2012 21:50:28 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
serk
HV kasutaja

liitunud: 24.05.2003




sõnum 24.01.2012 22:05:19 vasta tsitaadiga

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 icon_smile.gif

Lg. Priit Serk
Kommentaarid: 8 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
Cemtey
HV kasutaja
Cemtey

liitunud: 04.03.2008




sõnum 25.01.2012 11:52:00 vasta tsitaadiga

.. kustutatud ..

viimati muutis Cemtey 23.04.2014 01:08:20, muudetud 1 kord
Kommentaarid: 18 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 17
tagasi üles
vaata kasutaja infot saada privaatsõnum
serk
HV kasutaja

liitunud: 24.05.2003




sõnum 25.01.2012 15:40:08 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  WWW »  .. kustutatud ..
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
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.