Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: MySQL ja rivien lajittelu

Sivun loppuun

manninen [01.08.2012 12:44:42]

#

 $k = "SELECT jarjestysnumero, henkiloid, arvo FROM v2_lasnaolo WHERE henkiloid IN (".implode(',',$arr).') AND kuukausi = 8';

 if(!($t = mysql_query($k))){
   return;
 }

 while($r = mysql_fetch_assoc($t)){

      echo '<br> jnro.'. $r['jarjestysnumero'].' henkilo : '. $r['henkiloid'] .' arvo  '. ucfirst($r['arvo']);
}

TULOS :

jnro.1089 henkilo : 36 arvo M
jnro.1090 henkilo : 36 arvo M
jnro.1091 henkilo : 36 arvo M
jnro.1092 henkilo : 36 arvo M
jnro.1093 henkilo : 36 arvo S
jnro.1094 henkilo : 36 arvo S
jnro.1095 henkilo : 36 arvo S
jnro.1096 henkilo : 36 arvo S
jnro.1097 henkilo : 36 arvo M
jnro.1098 henkilo : 36 arvo M
jnro.1099 henkilo : 36 arvo M
jnro.1100 henkilo : 36 arvo M
jnro.1101 henkilo : 36 arvo S
jnro.1102 henkilo : 36 arvo S

Miten onnistun luomaan joko php:llä tai mysql kyselyssä selkeän lajittelun
järjestysnumeron mukaan. Tulos pitäisi olla seuraavanlainen

jnro.1089 henkilo : 36 arvo M
jnro.1090 henkilo : 36 arvo M
jnro.1091 henkilo : 36 arvo M
jnro.1092 henkilo : 36 arvo M

yht 4

jnro.1093 henkilo : 36 arvo S
jnro.1094 henkilo : 36 arvo S
jnro.1095 henkilo : 36 arvo S
jnro.1096 henkilo : 36 arvo S

yht 4

jnro.1097 henkilo : 36 arvo M
jnro.1098 henkilo : 36 arvo M
jnro.1099 henkilo : 36 arvo M
jnro.1100 henkilo : 36 arvo M

yht 4

jnro.1101 henkilo : 36 arvo S
jnro.1102 henkilo : 36 arvo S

yht 2

Mod. korjasi kooditagit!

Lebe80 [01.08.2012 12:50:04]

#

Kun kerran teet tämän php:lla, niin mikset laske siellä php:n loopissa kuinka monta henkilöä siinä "samassa arvossa" on?

Eli kun arvo vaihtuu, niin näytät kuinka isoksi juokseva luku kerkisi kasvaa ja nollaat sen jälkeen juoksevan luvun arvon.

manninen [01.08.2012 13:39:02]

#

Ei nyt minulla juokse ajatus niinkuin pitäisi. Vertailua en voi tehdä henkilön id:n mukaan vaan siinä on useampi ehto.

jnro.711 henkilo : 7 arvo M
jnro.712 henkilo : 7 arvo M

Nämä kaksi lasketaan yhteen koska niissä on peräkkäiset arvo 711 ja 712 sekä M

jnro.717 henkilo : 7 arvo S

Tämä on yksittäinein avo, koska siinä ei ole peräkkäisiä arvoja ja se on S

Kaikki nämä ovat kuitenkin saman henkilön.


jnro.363 henkilo : 36 arvo M

TOKI M JA S:LLE VOI TEHDÄ OMAN KYSELYNSÄ. USKON KUITENKIN, ETTÄ NE SAA SAMAAN KUN VAIN TAJUAA MITEN :)
jnro.364 henkilo : 36 arvo M

jnro.365 henkilo : 36 arvo S
jnro.366 henkilo : 36 arvo S

Ylläolevat ovat kaksi erillistä arvoa koska niissä on m ja s.
molemmista tulokseksi siis pitäisi tulla 2 363,364

erikoisuutena on, että vaikka luvut jatkuu 365, niin m ja s merkinnät poissulkevat peräkkäislaskennan.

Lebe80 [01.08.2012 14:19:39]

#

No mitä jos tekisit vertailun useamman kuin yhden id:n mukaan, jos kerran sitä haet?

Äläkä nyt mieti mitenkään monimutkaisesti ja laske mitään yhteen, vaan teet looppiin yhden muuttujan (nimetään se vaikka nimellä rivejaYhteensa), jonka arvoa kasvatat yhdellä. Jos verrattavien arvojen arvot muuttuvat sen verran, että ne kuuluvat "toiseen" luokkaan, niin tulostat juoksevan muuttujan arvon (rivejaYhteensa) ja sen jälkeen nollaat sen arvon.

Eli ei mitään ylimääräisiä tietokantakyselyitä, ei mitään eri arvojen yhteenlaskuja, vaan ainoastaan pelkästään yksi if-lause, jolla katsot onko ehto täyttynyt!

edit:
Luonnollisesti joudut pitämään kirjaa siitä, mitkä on "edellisen" rivin vertailtavat arvot, jotta voit verrata niitä "nykyiseen". Tietokantakyselyssä tietystä kannattaa järjestää tulokset semmoiseen muotoon, että samanlaiset arvot ovat oletuksena peräkkäin (kuten esimerkissäsi).

Ei kuitenkaan mitään "rakettitiedettä".

Hennkka [01.08.2012 14:35:49]

#

Edit.
Näköjään Lebe80 ehti vastata jo, itse olisin antanut pseudokoodin. No, se ei kuitenkaan ole syy, miksi koodi puuttuu. Syy on se, että koska Lebe laittoi viestin sillä aikaa kun kirjottelin omaani, niin oma viestini tuli tyhjänä perille. Toivottavasti saatte tämän korjattua :)

Lebe80 [01.08.2012 14:59:09]

#

Hennkka kirjoitti:

Edit.
Näköjään Lebe80 ehti vastata jo, itse olisin antanut pseudokoodin. No, se ei kuitenkaan ole syy, miksi koodi puuttuu. Syy on se, että koska Lebe laittoi viestin sillä aikaa kun kirjottelin omaani, niin oma viestini tuli tyhjänä perille. Toivottavasti saatte tämän korjattua :)

anteeksi. :)

Hennkka [01.08.2012 18:32:40]

#

Lebe80 kirjoitti:

Hennkka kirjoitti:

Edit.
Näköjään Lebe80 ehti vastata jo, itse olisin antanut pseudokoodin. No, se ei kuitenkaan ole syy, miksi koodi puuttuu. Syy on se, että koska Lebe laittoi viestin sillä aikaa kun kirjottelin omaani, niin oma viestini tuli tyhjänä perille. Toivottavasti saatte tämän korjattua :)

anteeksi. :)

Ei haittaa. Itseasiassa menin ennen lähetystä kopioimaan viestin leikepöydälle, joten koodi löytyy vielä työpöydältä :) Ajattelin vain, että katsotaan ensin noilla sinun ohjeilla, onnistuuko.

manninen [01.08.2012 19:15:38]

#

Mielellään otan muitakin ehdotuksia vastaan, koska lopputulos ei ole mielestäni mairitteleva.

while($r2 = mysql_fetch_assoc($t2)){

      $id = $r2['henkiloid'];
      $arvo = ucfirst($r2['arvo']);
      $solunId = $r2['solunid'];

      if(empty($newId)){
        $newId = $id;
      }

      if($newId == $id){

        if(empty($newType)){
          $newType = $arvo;
        }

        if($newType == $arvo){
          //echo $newId;
          echo '&nbsp;&nbsp;' . ucfirst($arvo);
          echo '&nbsp;&nbsp;' . $solunId;
          echo '<br>';
        }
        else{
          $newType = '';
          $maara = 1;

          echo '<hr>';
          //echo $newId;
          echo '&nbsp;&nbsp;' . ucfirst($arvo);
          echo '&nbsp;&nbsp;' . $solunId;
          echo '<br>';
        }

      echo 'maara' . $maara++;
      }

      else{
        $maara = 0;
        $lukumaara = 0;
        $newId = '';
        echo '<hr>';
      }

Periaatteessa toimiva, mutta ei ehkä loogisimmin rakennettu :)

Lebe80 [02.08.2012 11:07:53]

#

Aika härpäkkeen sait noinkin yksinkertaisesta asiasta... :D

Itse olisin vain laittanut loopin alkuun että tulostaa määrän, jos nuo "edellisen rivin" arvot on muuttuneet, kunhan ei ole vain ensimmäinen rivi kyseessä.

manninen [03.08.2012 14:33:19]

#

Lebe80 kirjoitti:

Kun kerran teet tämän php:lla, niin mikset laske siellä php:n loopissa kuinka monta henkilöä siinä "samassa arvossa" on?

Eli kun arvo vaihtuu, niin näytät kuinka isoksi juokseva luku kerkisi kasvaa ja nollaat sen jälkeen juoksevan luvun arvon.

En laske henkilöitä vaan lasken montako perättäistä arvoa on kullakin henkilöllä.

1,2,3,4,5,6

yht 6

1,2,5,6,8,9

Yht 2,2,2

Härpäkkeen sain aikaiseksi, mutta sen tiedän. Yksinkertaista asiaa pyrin ratkaisemaan liian monimutkaisella tavalla, mutta jos saisin mieleeni miten teen sen yksinkertaisesti ongelma olisi jo ratkennut.

while($r = mysql_fetch_assoc($t)){

      $henkilonId = intval($r['henkilonid']);

      print '<hr>';

      if(!empty($henkilonId)){
        LasnaoloMerkinnat($henkilonId);
      }

    }

    function LasnaoloMerkinnat($id){

      $k = "
        SELECT
        DATE_FORMAT(paivamaara, '%d.%m.%Y') paiva,
        DAYOFMONTH(paivamaara) AS pv,
          henkiloid, arvo
        FROM v2_lasnaolo
          WHERE henkiloid = $id
            AND kuukausi = 8
            AND vuosi = 2012
        ORDER BY
          henkiloid";

      if(!($t = mysql_query($k))){
        return;
      }

      while($r = mysql_fetch_assoc($t)){

        $paivamaara = htmlspecialchars($r['pv']);
        $paiva = htmlspecialchars($r['paiva']);
        $arvo = htmlspecialchars($r['arvo']);
        $id = intval($r['henkiloid']);

        echo $paiva .' '. $arvo .' '. $paivamaara .'<br>';

        }
    }

Montaa eri tapaa olen huvikseni kokeillut ja tullut siihen tulokseen, että tämä on tapa jolla lähden purkamaan asiaa muiden toimintojen vuoksi. Kuten ylempi silmukka kertoo, on tämä jatkokysely toiselle tai siis tämäm tulee olemaan runko kokonaan vanhalle ominaisuudelle joka ei enää palvele. Purkkapaketilla tämän saa kasaan, mutta kokeilemalla, kyselemällä ja tekemällä ehkä minäkin vielä opin olemaan käyttämättä purkkaa.

Anyway!

Nyt data tulee minulle näin. Ja siitä pitäisi laskea montako perättäisä arvoa on

02.08.2012 M 2
03.08.2012 M 3
04.08.2012 M 4
07.08.2012 S 7
08.08.2012 S 8

eli
2,3,4 = yhteensä 3 peräkkäistä arvoa
7,8 = yhteensä 2 peräkkäistä arvo

Tiedän, ota edellinen arvo muistiin ja vertaa sitä. Mutta, kuten näette härpäkkeestäni kaipaisin näinkin yksinkertaiseen asiaan jonkun joka sytyttää valon lamppuuni.

manninen [07.08.2012 16:34:30]

#

Nostan uudeleen esiin tämän kysymyksen, koska en ole saanut vielä lamppuani syttymään.

samip [07.08.2012 20:10:58]

#

<?php

function out(array $sequence)
{
	printf('%s = yhteensä %u peräkkäistä arvoa<br>', implode(", ", $sequence), count($sequence));
}

$numbers = array(1, 2, 3, 4, 6, 7, 9);
$sequence = array();

foreach ($numbers as $n)
{
	if (empty($sequence))
	{
		$sequence = array($n);
		continue;
	}

	if ($n === end($sequence) + 1)
	{
		$sequence[] = $n;
	}
	else
	{
		out($sequence);
		$sequence = array($n);
	}
}

out($sequence);

Tulostaa

1, 2, 3, 4 = yhteensä 4 peräkkäistä arvoa
6, 7 = yhteensä 2 peräkkäistä arvoa
9 = yhteensä 1 peräkkäistä arvoa


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta