praegune kellaaeg 27.06.2025 09:44:28
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
Cemtey
HV kasutaja

liitunud: 04.03.2008
|
24.01.2012 03:33:38
.. kustutatud .. |
|
|
.. kustutatud ..
viimati muutis Cemtey 23.04.2014 01:08:00, muudetud 1 kord |
|
Kommentaarid: 18 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
17 |
|
tagasi üles |
|
 |
riaak
HV Guru

liitunud: 22.09.2002
|
24.01.2012 11: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 12: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 13: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 15: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: 06.12.2004
|
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
5 |
|
tagasi üles |
|
 |
serk
HV kasutaja
liitunud: 24.05.2003
|
24.01.2012 21: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 22: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 21: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 22: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 11:52:00
|
|
|
.. kustutatud ..
viimati muutis Cemtey 23.04.2014 01: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 15: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.
|