Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: SQLite: Kolme kyselyä yhteen?

Sivun loppuun

creepy [10.03.2014 11:54:08]

#

Mites saisin samalla kyselyllä tehtyä kolme kyselyä

eli
SELECT data FROM taulu where tieto="jep"
SELECT data FROM taulu where tieto="foo"
SELECT data FROM taulu where tieto="bar"

tarkoitus olisi samassa foreachissa tulostaa noista tiedot tyyliin
jep foo bar
1 1 1
2 2 2
3 3 3

eli pitäisi siis saada select (kaikki foo:n arvot) as foo, (kaikki bar:n arvot) as bar --- from taulu

Lebe80 [10.03.2014 12:01:38]

#

Jos pitää saada samasta taulusta, niin käytä "OR" ehtoa.

SELECT data FROM taulu where tieto="jep" or tieto="foo" or tieto="bar"

creepy [10.03.2014 12:08:50]

#

samasta taulusta mutta tarvitsen ne eri muuttujaan..

eli selectin ja from:n väliin pitäisi saada 3 eri "muuttujaa"

Lebe80 [10.03.2014 12:19:21]

#

ja siis miksei voi tehdä kolmella eri kyselyllä?

Voisitko kertoa suomeksi mikä olisi haluttu lopputulos, mitä taulut sisältää ja mitä haluat tehdä, niin aletaan sitten selvittämään sitä kyselyä/kyselyitä.


Tätä epäselvempää lopputulosta en ole hetkeen nähnytkään:
jep foo bar
1 1 1
2 2 2
3 3 3

Teuro [10.03.2014 12:30:54]

#

Eli kaikki tulokset pitäisi ryhmitellä hakusanan perusteella tuloksien mukaiseen järjestykseen pienimmästä suurimpaan? Haet vain yhden sarakkeen, joten tulossarakkeita on vain yksi.

Voisit toki hakea kolmellakin kyselyllä tiedot ja sitten "kätevästi" yhdistää tulokset ja tulostella esille. Ehkä kuitenkin kerrot mitä lebe80 pyysi.

creepy [10.03.2014 17:52:20]

#

Joo, olen erittäin huono selittämään näitä ongelmia..

Saahan sitä php:llä if lauseilla niitä tietenki jaoteltua, mutta olisi niin kätevää jo sql:llä jaotella ne muuttujiin..

haluaisin siis tulostaa foreach loopissa näin

 echo"{$row["jep"]},{$row["foo"]},{$row["foo"]} ";

Teuro [10.03.2014 18:20:42]

#

Mutta onko sinun tietokannassa tuon nimisiä kenttiä ensinkään? Tuon kyselyn perusteella haet vain kentästä 'data' tietoa, joten mainitsemiasi kenttiä ei voi tuloslistauksessa ollan mitenkään.

Kerro siis ihan koko ongelma, niin sille saadaan varmaankin tolkullinen ratkaisu.

Metabolix [10.03.2014 18:23:07]

#

Millä perusteella tiedot liittyvät toisiinsa? Mistä tietää, että juuri tietty foo-asia ja tietty bar-asia kuuluvat samalle riville tuloksissa? Jos tällaista tietoa ei ole, tiedot täytyy hakea eri kyselyillä ja ne on yleensä myös viisainta esittää sivulla erikseen; toisistaan erilliset tiedot eivät kuulu samalle tulosriville. Jos taas tiedoilla on jokin yhdistävä tekijä ja jokaista tietoa on tasan yksi ryhmässään, voit toki tehdä yhteisen kyselyn:

SELECT
	a.luku AS jep,
	b.luku AS foo,
	c.luku AS bar
FROM taulu AS a
JOIN taulu AS b ON b.juttu = a.juttu AND b.tieto = "foo"
JOIN taulu AS c ON c.juttu = a.juttu AND c.tieto = "bar"
WHERE a.tieto = "jep"

creepy [10.03.2014 20:08:54]

#

Olen onnistunut sekoittamaan teidät täysin..

On siis yksitaulu jossa tälläista dataa
kohde data
foo 1.25
jep 20.4375
bar 20.1875
foo 1.3125
jep 20.4375
bar 20.125
foo 1.375
jep 20.5

nyt pitäisi php:ssa saada nuo foot, baarit yms omiin muuttujiinsa, jotta voin ne tulostaa aikaisemmassa viestissä mainitulla tavalla
nythän ne tulee foreach loopissa kaikki $row['kohde/data'] muuttujaan putkeen..

Metabolix [10.03.2014 20:23:14]

#

Selitin jo: SQL tukee lähtökohtaisesti vain loogisia liitoksia. Jos taulu ei sisällä mitään tietoa siitä, miten nuo arvot liittyvät toisiinsa, rivejä ei kuulu yhdistellä SQL-kyselyllä. (Toisistaan aivan erillisiä arvoja ei myöskään yleensä kuulu tulostaa yhdessä.)

Haluat nyt kuitenkin tulostaa ne noin, joten tulosta sitten. Yhdistäminen on paras tehdä PHP:llä.

<?php
$jep = sql::rivit("SELECT data FROM taulu WHERE tieto = 'jep'");
$foo = sql::rivit("SELECT data FROM taulu WHERE tieto = 'foo'");
$bar = sql::rivit("SELECT data FROM taulu WHERE tieto = 'bar'");
$n = max(count($jep), count($foo), count($bar));
$t = array_fill(0, $n, array("jep" => null, "foo" => null, "bar" => null));
foreach ($jep as $i => $j) $t[$i]["jep"] = $j["data"];
foreach ($foo as $i => $j) $t[$i]["foo"] = $j["data"];
foreach ($bar as $i => $j) $t[$i]["bar"] = $j["data"];
foreach ($t as $row) {
	echo "{$row["jep"]},{$row["foo"]},{$row["bar"]}\n";
}

creepy [10.03.2014 21:00:03]

#

OK, menipäs vaikeaksi.. Olin jotenkin varma että tuo onnistuisi sql:llä.

Kiitoksia paljon..

Grez [10.03.2014 21:37:50]

#

creepy kirjoitti:

OK, menipäs vaikeaksi.. Olin jotenkin varma että tuo onnistuisi sql:llä.

No onnistuu se SQL:lläkin... Varmasti vasarallakin pystyy sahaamaan puuta, mutta sahalla se vaan käy helpommin.

creepy [10.03.2014 22:12:51]

#

En tiedä teikö nyt järkevästi mut virittelin tälläisen purkkavirityksen

foreach($dbh->query(SELECT tila, data, aika FROM taulu) as $row) {
           $klo=date('H:i',$row["aika"]);
           switch ($row['tila']) {
                   case "jep":
                   $makkari=$row['data'];
                   break;
                   case "foo":
                   $lastenmakkari=$row['data'];
                   break;
                   case "bar":
                   $vierashuone=$row['data'];
                   break;

           }
           if (isset($jep) && isset($foo) && isset($bar)){
           echo"['{$klo}',{$jep},{$foo},{$bar}],";
           unset($jep);
           unset($foo);
           unset($bar);
           }

edit: eiku eihän tuo noin voi tietenkään toimia, jääpi aika paljon dataa pois

feenix [10.03.2014 23:10:45]

#

Jos et määritä mitään järjestystä, tietokanta voi antaa vaikka kaikki jepit ensin, sitten foot ja sitten barit, joten saat yhden ainoan rivin.


Sivun alkuun

Vastaus

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

Tietoa sivustosta