» »

Potrebujem MySQL ukaz

Potrebujem MySQL ukaz

zvmk ::

Živjo,

Imam tabelo

mysql> DESCRIBE poraba;
+------------+------------+------+-----+-------------------+-----------------------------+
| Field      | Type       | Null | Key | Default           | Extra                       |
+------------+------------+------+-----+-------------------+-----------------------------+
| mesec      | timestamp  | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| voda_mrzla | varchar(5) | NO   |     | NULL              |                             |
| voda_topla | varchar(5) | NO   |     | NULL              |                             |
+------------+------------+------+-----+-------------------+-----------------------------+



Potrebujem MySQL ukaz, ki bi prebral iz tabele "poraba" trenutni (zadnji zapis) in zapis iz prejšnega mesca jih odštel ter vpisal v tabelo "usage_per_month"
Se pravi npr.:
voda_mrzla (mar) - voda_mrzla (feb) = difference_cold
voda_topla (mar) - voda_topla (feb) = difference_hot

mysql> DESCRIBE usage_per_month;
+-----------------+-------------+------+-----+---------+-------+
| Field           | Type        | Null | Key | Default | Extra |
+-----------------+-------------+------+-----+---------+-------+
| difference_cold | varchar(10) | NO   |     | NULL    |       |
| difference_hot  | varchar(10) | NO   |     | NULL    |       |
+-----------------+-------------+------+-----+---------+-------+


primer trenutnega vpisa je

mysql> SELECT * FROM poraba;
+---------------------+------------+------------+
| mesec               | voda_mrzla | voda_topla |
+---------------------+------------+------------+
| 2014-03-03 16:19:08 | 5985       | 3417       |
| 2014-04-03 19:48:35 | 5986       | 3418       |
+---------------------+------------+------------+


Mogoče bi bilo lažje s tako tabelo, da lahko naredim select from previous id_poraba

mysql> SELECT * FROM poraba;
+---------------------+------------+------------+-----------+
| mesec               | voda_mrzla | voda_topla | id_poraba |
+---------------------+------------+------------+-----------+
| 2014-03-03 16:19:08 | 5985       | 3417       |         1 |
| 2014-04-03 20:57:51 | 5978       | 3412       |         2 |
+---------------------+------------+------------+-----------+



V Naprej hvala.
  • spremenilo: zvmk ()

phong ::

Potrebujem MySQL ukaz, ki bi prebral iz tabele "poraba" trenutni (zadnji zapis)

SELECT voda_mrzla FROM poraba ORDER BY timestamp DESC LIMIT 2;
(z zgornjim ukazom prikažeš le zadnji 2 vrstici).

Lahko pa tudi nekaj takega (če želiš določen časovni range):
SELECT voda_mrzla FROM poraba WHERE timestamp > '2014-03-20 00:00:00' AND timestamp < '2014-04-01 00:00:00';

pridobljene vrstice obdeluj po mili volji. Rezultat shraniš z SQL stavkom (seveda s svojimi vrednostmi:
INSERT INTO usage_per_month VALUES(2014-04-01 00:00:00', 300, 250, 1);

Lp

carota ::

Kaj če bi začel s tabelami in jih konsistentno poimenoval, npr. vse v angleški ali vse v slovenski jezik ("poraba", "usage_per_month" ...), ime pojla "mesec" in tip "timestamp" ne gresta skupaj (mesec je interval, timestamp pa točna sekunda), vsaka tabela naj bi imela primary key, in nenazadnje, zakaj imaš porabo tipa VARCHAR in ne INT?

Če nimaš temeljev postavljenih, ne se lotit gradit hiše. ;)

Mesar ::

V praksi lahko primerja datetime in timestamp http://stackoverflow.com/questions/1048... :D
Your turn to burn!

zvmk ::

@catora. ja tabele so res malce zmešane ang/slo ampak to bom na koncu tako ali tako spremenil vse v isti jezik kar pa je čisto vseeno lahko bi polja poimenoval xxsdfkjaflkdssdf pa bi delovalo enako. Polje mesec je tam, ker bo zapis narejen samo 1x na mesec. Vse kar pa sem v tvojem odgovoru videl je kritiziranje mojega vprašanja na mesto, da bi mi dejansko pomagal z nekim konkretnim odgovorm!

@Mesar Hvala za info ampak datuma/ure niti ne bom uporabljal, dodal sem ga samo za referenco oz. za pomoč pri izračunu (trenutni mesec - prejšni mesec). Ampak to mislm, da bi bilo tako ali tako najžje narediti kar z id_poraba.

Najbližje, ki mislim, da bi lahko naredil je z primerom tukaj
http://stackoverflow.com/questions/1503...

Samo so tabele drugače postavljene pa se mi zadeva zatika.

Zgodovina sprememb…

  • spremenilo: zvmk ()

BigWhale ::

zvmk je izjavil:

@catora. ja tabele so res malce zmešane ang/slo ampak to bom na koncu tako ali tako spremenil vse v isti jezik kar pa je čisto vseeno lahko bi polja poimenoval xxsdfkjaflkdssdf pa bi delovalo enako. Polje mesec je tam, ker bo zapis narejen samo 1x na mesec. Vse kar pa sem v tvojem odgovoru videl je kritiziranje mojega vprašanja na mesto, da bi mi dejansko pomagal z nekim konkretnim odgovorm!


Kritika je bila povsem na mestu. Zaradi tega, ker imas stolpca, s stanji stevcev, tipa VARCHAR namesto INT, se tega, po cemur ti sprasujes sploh ne da narediti. Oziroma celotno stvar samo zakomplicira. Poleg tega imas ime enega stolpca `timestamp`, kar vse skupaj se malo bolj zakomplicira, ker je TIMESTAMP tudi funkcija v MySQLu.

SELECTa razlike dveh vrstic v nekem stolpcu ni tako zelo enostavno narediti, zato je precej pomembno, da so podatki prej pravilno strukturirani.

Tvoj SELECT bi v grobem zgledal nekako takole:

SELECT p1.voda_mrzla - p2.voda_mrzla AS poraba_mrzla, p1.voda_topla - p2.voda_topla AS poraba_topla FROM poraba p1
  LEFT JOIN poraba p2 ON p2.`timestamp` = (
    SELECT MAX(`timestamp`) FROM poraba p3 WHERE p3.`timestamp` < p1.`timestamp`
  ) ORDER BY p1.`timestamp` DESC LIMIT 1


Tale select naredi razliko med zadnjima dvema vrsticama. Z malo telovadbe v WHERE pogoju lahko stvar popravis tako, da bos izbral vrstico iz prejsnjega meseca.

carota ::

zvmk je izjavil:

@catora. ja tabele so res malce zmešane ang/slo ampak to bom na koncu tako ali tako spremenil vse v isti jezik kar pa je čisto vseeno lahko bi polja poimenoval xxsdfkjaflkdssdf pa bi delovalo enako. Polje mesec je tam, ker bo zapis narejen samo 1x na mesec. Vse kar pa sem v tvojem odgovoru videl je kritiziranje mojega vprašanja na mesto, da bi mi dejansko pomagal z nekim konkretnim odgovorm!

Verjamem, da sem ti dal konstruktivno kritiko, da najprej uredi osnove in konkretno sem ti napisal katere in zakaj. Če se ne potrudiš niti toliko, da bi to sam rešil, potem zaman pričakuješ, da bom trošil svoj čas in ti pomagal.

Glede na to, da sem si vzel čas za napisat post pomeni, da sem pripravljen pomagat.

carota ::

Mesar je izjavil:

V praksi lahko primerja datetime in timestamp http://stackoverflow.com/questions/1048... :D

Vem, da se ju lahko primerja, ampak pomensko "mesec" ne ustreza tipu "timestamp".

zvmk ::

@BW hvala za odgovor. Spremenil sem z VARCHAR v INT, glede timestamp pa ne vidim kje misliš, da ga imam poimenovanega v stolpcu. V tabeli poraba je samo type timestamp za mesec.

Z uporabo SELECT voda_mrzla, voda_topla FROM poraba ORDER BY id_poraba DESC LIMIT 2;
http://sqlfiddle.com/#!2/33206/3
dobim dva stolpca

pri tvoji kodi pa mi prikaže error na p2.timestamp
http://sqlfiddle.com/#!2/33206/2

Zadeve sem se lotil drugače. Sicer pravijo, da je tukaj nevarnost, če zbrišem kak id_poraba, ampak tega namena nimam. Aja uporabil sem sdeleče
http://sqlfiddle.com/#!2/9ae51/1

BigWhale ::

zvmk je izjavil:

@BW hvala za odgovor. Spremenil sem z VARCHAR v INT, glede timestamp pa ne vidim kje misliš, da ga imam poimenovanega v stolpcu. V tabeli poraba je samo type timestamp za mesec.


Ah, sem spregledal.

zvmk je izjavil:


pri tvoji kodi pa mi prikaže error na p2.timestamp
http://sqlfiddle.com/#!2/33206/2


Vidis, zaradi taksnih napak je dobro, da se naucis nekaj osnov. Sedaj ti niti priblizno ni jasno kaj tale koda pocne oziroma zakaj pride do napake. V moji kodi zamenjaj `timestamp` z imenom stolpca v katerem imas timestamp.

zvmk ::

@BW hvala,se probal s spremembo timestamp z mesec in deluje enako kot sprememba s id_poraba. No malce sem se pa že naučil :)

@crota, da me ne boš razumel narobe. Hvala za pripombe oz. kritike na moje delo. Zmotilo me je samo (kar se mi dogaja večkrat, predvsem na slovenskih forumih), komentarji kot so

carota je izjavil:

Če nimaš temeljev postavljenih, ne se lotit gradit hiše. ;)


Nič narobe samo namesto takih komentarjev bi raje videl npr: jaz bi tabelo postavil tako, da bi ven vzel timestamp, dodaj novo tabelo, vrstico itd.

Da sem videl, da si mi pradlagal postaviti ID v vsako tabelo in spremembo iz VARCHAR v INT in tako sem tudi naredil ;) tnx!

No pa da se vrnem na problem, trenutno sem se ustavil tukaj
SELECT p1.voda_mrzla - p2.voda_mrzla AS poraba_mrzla1, p1.voda_topla - p2.voda_topla AS poraba_topla1 FROM poraba p1
  LEFT JOIN poraba p2 ON p2.`id_poraba` = (
    SELECT MAX(`id_poraba`) FROM poraba p3 WHERE p3.`id_poraba` < p1.`id_poraba`
  ) ORDER BY p1.id_poraba DESC LIMIT 1
INSERT INTO usage_per_month (difference_cold, difference_hot) 
SELECT voda_mrzla1,voda_topla1 FROM poraba


Eden izmed poizkusov, ki sem jih naredil je opisan tukaj. Brez uspeha seveda! http://stackoverflow.com/questions/1490...

rezultat poraba_mrzla1 bi rad vpisal v difference_cold in poraba_topla1 v difference_hot

Kakšna idea?

keworkian ::

INSERT INTO usage_per_month (difference_cold, difference_hot) 
SELECT p1.voda_mrzla - p2.voda_mrzla AS poraba_mrzla1, p1.voda_topla - p2.voda_topla AS poraba_topla1 FROM poraba p1
  LEFT JOIN poraba p2 ON p2.`id_poraba` = (
    SELECT MAX(`id_poraba`) FROM poraba p3 WHERE p3.`id_poraba` < p1.`id_poraba`
  ) ORDER BY p1.id_poraba DESC LIMIT 1
Obscenities in B-Flat

zvmk ::

@keworkian uhuuuuu ZAKON tnx dela !!! Vidm, da niti nisem bil daleč ;)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[SQL] Pohitritev izpisa

Oddelek: Programiranje
252628 (1527) kuall
»

oracle 12 identity (the old way)

Oddelek: Programiranje
6989 (794) detroit
»

Pomoč pri izdelavi Python skripte (strani: 1 2 )

Oddelek: Programiranje
615406 (4052) BigWhale
»

MySQL procenti

Oddelek: Programiranje
91096 (762) Malik12
»

[SQL] - združitev glede na iste vrednosti

Oddelek: Programiranje
131268 (910) tx-z

Več podobnih tem