Terve, terve.. Olen nyt jatkokehittämässä aikaisemmin rakentamaani Työvuoronvaraus sovellusta.
-----------------------------------------------------------------------------------------------
KÄYTTÖTAPAUS: Ylläpito puolella ylläpitäjä hakee kaikki tapahtumat.
tapahtuma 1
tapahtuma 2
tapahtuma 3
- Nyt haluaisin näyttää jokaisen tapahtuman kohdalla kuinka monta työvuoroa on varattu!?
ALLA olevassa koodissa osaan tehdä tämän 1 tapahtuman kohdalla, mutta miten sama tehdään kaikkien tapahtumien kohdalla?
<?php $con = mysql_connect("*","*","*"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("*", $con); $T_Id = $_REQUEST['T_Id']; $sql_lauseke = "SELECT * FROM Tapahtuma WHERE T_Id=" . $T_Id; if( !$kysely = mysql_query($sql_lauseke)) { echo "Haku epäonnistui!"; } else { $rivi = mysql_fetch_row($kysely); $T_Id = $rivi[0]; } $sql_haetietoja = "SELECT tTarve FROM Tapahtuma WHERE T_Id = " . $T_Id . " "; if(!$hae = mysql_query($sql_haetietoja)) { echo ""; } else { $tulos = mysql_fetch_row($hae); $sql_haetietoja2 = "SELECT COUNT(Tapahtuma_Id) FROM Varaus WHERE Tapahtuma_Id = " . $T_Id . " "; if(!$hae2 = mysql_query($sql_haetietoja2)) { echo ""; } else { $tulos2 = mysql_fetch_row($hae2); } if((int) $tulos[0] == $tulos2[0]) { echo "TAPAHTUMA ON VARATTU LOPPUUN"; } } ?>
Tässä tapauksessa $tulos2[0] on VARAUSTEN määrä ja $tulos[0] TARVE joka ilmoittaa kuinka monta työvuoroa on tarjolla kyseiseen tapahtumaan. Tästä asiasta oli aikanaan puhetta Metabolixin kanssa, mutta päädyin silloin menemään helpoimman reitin kautta koska tehtävä oli muutenkin haastava (työvuoron varaus sovellus).
no jos ehditte katsoa niin kiva.
Holy space exploration, batman. Jätät sieltä kyselystä where ehdon pois niin johan tuloo counttia kaikille.
Hetkinen oletko oikeasti tuota mieltä..? Asiakastyö kyseessä ja omat taidot ovat rajalliset, thänks.
Suattap olla että heitin väsyneillä silmillä aika hatusta, oli illalla pakko päästä kommentoimaan puol näyttöä vieviä sisennyksiä :), pahoittelut tästä. Laita COUNT-kyselyssä WHEREn
tilalle sopiva GROUP BY
-määre.
Juu..
Ensinnäkin onko
$T_Id = $_REQUEST['T_Id'];
turha, koska haen useamman tapahtuman tietoja kerralla.
Eli kysyn tietokannasta 1.)näytä kaikki tapahtumat, 2.)tuo niiden tarve luku, 3.)laske varausten määrä kyseisiin tapahtumiin. Jotenkin sellainen tunne että koko kysely on täysin pielessä.
Tämäkin kohta epäilyttää..
$sql_lauseke = "SELECT * FROM Tapahtuma WHERE T_Id=" . $T_Id;
Ehdittekö auttaa että pääsen edes alkuun tässä asiassa.. Osaan tehdä haun 1 en monelle!!
Elikkä ei apua tarjolla, ymmärrän..
Noi sisennykset on vähän liioteltuja ja haittaa aika selvästi lukemista.
Ehkä korvaat koko homman vaikka näin. Saattaa siitäkin virhe löytyä, voit ainakin testata.
$yhteys = mysql_connect("", "", "") or die(mysql_error()); mysql_select_db(""); $kysely = mysql_query("SELECT Varaus.Tapahtuma_Id, COUNT(Varaus.Tapahtuma_Id), Tapahtuma.tTarve FROM Varaus, Tapahtuma GROUP BY Varaus.Tapahtuma_Id") or die(mysql_error()); while($tulos = mysql_fetch_array($kysely)) { echo ($tulos[1] == $tulos[2]) ? "Täynnä!" : "Tilaa on!"; }
Kiitos Macro,
olen pahasti jumissa, ollut nyt jo 2 päivää kun en osaa tätä asiaa hoitaa. Tutkin koodin!
Jeps, kuten Macro sanoikin jo noista sisennyksistä, niin sanonpa vähän lisää, ehkä asiat ovat tuttujakin jo.
Pätkä koodista:
<?php $con = mysql_connect("*","*","*"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("*", $con);
Olisi järkevämmin sisennettynä näin:
<?php $con = mysql_connect("*","*","*"); if (!$con){ die('Could not connect: ' . mysql_error()); } mysql_select_db("*", $con);
Tutkippa vähän tuota.
Eli aina, jos jokin koodi kuuluu toisen koodin sisään, esim. if-lause, niin sen se sisennetään, muuta ei.
Lupaan opetella sisennyksen.
Tuohon Macron vinkkiin, että nyt näyttää jokaisen tapahtuman kohdalla "Tilaa on" vaikka osa täynnä. Yritän miettiä mikä vikana.
Eli nyt:
Tapahtuma 1 ------------------tarve 5
Tapahtuma 2 ------------------tarve 2
Tapahtuma 3 ------------------tarve 10
Tavoite:
Tapahtuma 1 ------------------tarve 5---------varattu 5
Tapahtuma 2 ------------------tarve 2---------varattu 1
Tapahtuma 3 ------------------tarve 10--------varattu 9
Lisäys:
Hetkinen..
Varaus
- Tapahtuma_Id
- Asiakas_Id
- varno
Tapahtuma
- T_Id
- tNimi
- tTarve
$kysely = mysql_query("SELECT Varaus.Tapahtuma_Id, COUNT(Varaus.Tapahtuma_Id), Tapahtuma.tTarve FROM Varaus, Tapahtuma GROUP BY Varaus.Tapahtuma_Id") or die(mysql_error());
Hmm.. Missä vaiheessa lasketaan esim. varaus numerot (varno) ??
Lisäys:
Tulos 1 tuo arvon:
562811284562884281681402825230825230828084280308
Tulos 2 tuo arvon:
444444444444444444444444444444
Arvo 2 on mielenkiintoinen sillä se on ensimmäisen tapahtuman tTarve eli 4
Lisäys:
MySQL-tietokanta kertoo seuraavaa:
SELECT Varaus.Tapahtuma_Id, COUNT( Varaus.Tapahtuma_Id ) , Tapahtuma.tTarve
FROM Varaus, Tapahtuma
GROUP BY Varaus.Tapahtuma_Id
--------------------------------------------------------------------------
Tapahtuma_Id COUNT(Varaus.Tapahtuma_Id) tTarve
20 56 4
21 28 4
22 112 4
23 84 4
24 56 4
25 28 4
26 84 4
27 28 4
28 168 4
29 140 4
30 28 4
36 252 4
37 308 4
38 252 4
39 308 4
40 280 4
41 84 4
42 280 4
43 308 4
44 224 4
45 308 4
46 336 4
47 196 4
48 252 4
49 252 4
50 224 4
51 168 4
53 224 4
54 140 4
55 196 4
Lisäys:
En tosiaankaan ymmärrä tätä logiikkaa.
1.) Miksi keskimmäiset luvut ovat niin suuria? (alin luku 196, vaikka varauksia on oikeasti yht. 7 kpl)
2.) SQL-lause ei tietenkään toimi, mutta nyt tuo ekan tapahtuman tTarve määrän 4, ei muiden.
---------------------------------------------------
Jos ehditte jossain vaiheessa kertoa miten ongelmani voitaisiin ratkaista niin kiva, en odota valmista koodia, mutta jotenkin tuntuu että edes tällä foorumilla ei tätä osata ratkaista siis loogisella puheella - mistä aloittaa mitä ollaan tekemässä.
Tämä kertoisi siitä että tehtävä on ehkä sittenkin aika vaikea,, vai ?
Ei tässä tarvita kuin ihan perustason ymmärrys SQL:stä. Cross join yhdistää kaikki taulun A rivit kaikkiin taulun B riveihin. Siis myös ne rivit x ja y, joilla ei ole mitään tekemistä toistensa kanssa. Totta kai summat ovat silloin ihan viturallaan.
Hei alkemisti,
Eli tarkoitin juurikin tuota. Tapahtumalla on id-numero ja kaiketi Varaus taulussa pitäisi laskea kukin id-numero, että montako kertaa se on taulussa. Jotenkin näin.
The Alchemist kirjoitti:
Cross join yhdistää kaikki taulun A rivit kaikkiin taulun B riveihin
- tutkin tuota tänään heti kun ehdin, kiitos ymmärryksestä.
Hei vaan,
Yritän nyt todella yksinkertaista asiaa. Eli tuoda pelkästään tapahtuman varausten määrän (jokaisen tapahtuman kohdalle).
SELECT Varaus.Tapahtuma_Id, COUNT(Varaus.Tapahtuma_Id) FROM Varaus GROUP BY Varaus.Tapahtuma_Id
Tulos on oikein:
-------------------------------------------------------------
Tapahtuma_Id COUNT(Varaus.Tapahtuma_Id)
20 2
21 1
22 4
23 3
-------------------------------------------------------------
MUTTA.. Varaus -tauluun jää tietenkin pesimään vanhojen tapahtumien id-numerot, joten miten sitten kun hakee niin saisi varausten määrät alkaamaan aktiivisista tapahtumista?
20,21 vanhoja
22,23 aktiivisia tapahtumia
Lisäys:
-------------------------------------------------------------
Tapahtuma -taulussa on kenttä tStatus!
jos tStatus on 'Tapahtumat' niin silloin tarkoitetaan aktiivisia tapahtumia.
SELECT Varaus.Tapahtuma_Id, COUNT( Varaus.Tapahtuma_Id ) FROM Varaus, Tapahtuma WHERE tStatus = 'Tapahtumat' GROUP BY Varaus.Tapahtuma_Id
Olen kokeillut yllä olevan tapaisia SQL-lauseita.
Lisäys:
On se kumma kun en keksi näitä SQL-lauseita.. jokin pieni toimivuus vika kaiketi!
SELECT Varaus.Tapahtuma_Id, Tapahtuma.tStatus, COUNT( Varaus.Tapahtuma_Id ) WHERE Tapahtuma.tStatus = Tapahtumat FROM Varaus, Tapahtuma GROUP BY Varaus.Tapahtuma_Id
Saatko mitään virheilmoituksia? Auttaako yhtään, jos tuossa alemmassa esimerkissäsi muutat Tapahtumat -> 'Tapahtumat'? En viitsi tehdä testitaulua, eikä tietokantakyselyt monesta taulusta ole muutenkaan erikoisen tuttuja minulle, joten ei tule välttämättä vielä tuolla kuntoon.
Vaihtaisin lisäksi WHERE ja FROM kohdat toisinpäin.
select-syntaksi (mysql 5.0)
Suosittelisin käyttämään yleisesti hyväksyttyjä periaatteita ihan kaikessa. Tilaa ei pidä koskaan merkitä varchar- saati text-tyyppisellä kentällä. Veikkaisin että "tStatus" on jompi kumpi. Joko käytät enumia tai sitten ihan vain integeriä, tai pikemminkin tinyinttiä. Ja sitten vielä niin, että 0 tarkoittaa aina negatiivista arvoa ("ei käytössä" yms.) ja positiiviset luvut muita tiloja.
Eli tarkoitatko alkemisti, että muuten lause oikein?
Tämä toimii moitteitta:
SELECT Varaus.Tapahtuma_Id, COUNT(Varaus.Tapahtuma_Id) FROM Varaus GROUP BY Varaus.Tapahtuma_Id
Mutta tässä mokaan:
SELECT Varaus.Tapahtuma_Id, COUNT(Varaus.Tapahtuma_Id), Tapahtuma.tStatus FROM Varaus WHERE Tapahtuma.tStatus = 'Tapahtumat' GROUP BY Varaus.Tapahtuma_Id
Virheilmoitus: Unknown column 'Tapahtuma.tStatus' in 'field list'
----------------------------------------------------------------
jaketsu, thänks kokeilin molempia ideoita, mutta ei silti toimi.
latenleffahylly kirjoitti:
Eli tarkoitatko alkemisti, että muuten lause oikein?
Tämä toimii moitteitta:
SELECT Varaus.Tapahtuma_Id, COUNT(Varaus.Tapahtuma_Id) FROM Varaus GROUP BY Varaus.Tapahtuma_IdMutta tässä mokaan:
SELECT Varaus.Tapahtuma_Id, COUNT(Varaus.Tapahtuma_Id), Tapahtuma.tStatus FROM Varaus WHERE Tapahtuma.tStatus = 'Tapahtumat' GROUP BY Varaus.Tapahtuma_IdVirheilmoitus: Unknown column 'Tapahtuma.tStatus' in 'field list'
----------------------------------------------------------------jaketsu, thänks kokeilin molempia ideoita, mutta ei silti toimi.
En tarkoita. Jälkimmäisessä kyselyssä vikana on se, ettei tapahtuma-taulu ole mukana FROM-ehdossa.
SELECT ... FROM varaus INNER JOIN tapahtuma ON varaus.tapahtuma_id = tapahtuma.id WHERE ...
Katsopa samalla tuosta mallia siihen, kuinka taulujen rivit tulee linkittää toisiinsa oikein. Kokeile vaikka samaa kyselyä laittaen FROM-osaksi aiemmin käyttämäsi "FROM varaus, tapahtuma" ja näet eron.
No entä jos lisäät myös sen toisen taulun mukaan?
SELECT Varaus.Tapahtuma_Id, COUNT(Varaus.Tapahtuma_Id), Tapahtuma.tStatus FROM Varaus, Tapahtuma WHERE Tapahtuma.tStatus = 'Tapahtumat' GROUP BY Varaus.Tapahtuma_Id
No voi veljet sentään!! ..kyllä olet alkemisti oikeassa. Kokeilin molempia tapoja on noilla kyllä eroa.
nyt tämä:
SELECT Varaus.Tapahtuma_Id, COUNT( Varaus.Tapahtuma_Id ) , Tapahtuma.tStatus FROM Varaus INNER JOIN Tapahtuma ON Varaus.Tapahtuma_Id = Tapahtuma.T_Id WHERE Tapahtuma.tStatus = 'Tapahtumat' GROUP BY Varaus.Tapahtuma_Id
tulos:
22 5 Tapahtumat
23 3 Tapahtumat
24 3 Tapahtumat
..Ja joukossa tosiaan on vain aktiivisia tapahtumia. Täytyypä vielä kerran miettiä tuo SQL-opetuksesi ja muistaa se seuraavalla kerralla. Suur kiitos alkemista, ja toki jaketsu kun yritit myös tukea.
Nyt kokeilemaan saanko SQL-lauseen osaksi työvuoronvaraus sovellusta.
Jos tarkoitat "aktiivisella" tapahtumalla sellaista, jota ei ole poistettu kannasta, ja "passiivisella" sellaista, joka on poistettu yhdestä taulusta mutta kummittelee toisessa, niin silloin sinun olisi syytä korjata koodisi poistamaan kaikki turhat rivit myös muista tauluista. Tietokannan eheys on tärkeä ominaisuus.
Voit toki automatisoida turhien rivien poistamisen tauluista käyttämällä InnoDB-moottoria ja vierasavaimia.
CREATE TABLE foo ( id INT NOT NULL, name TEXT, PRIMARY KEY (id) ) ENGINE=InnoDB; CREATE TABLE bar ( foo_id INT NOT NULL, address TEXT, FOREIGN KEY (foo_id) REFERENCES foo(id) ON DELETE CASCADE ) ENGINE=InnoDB; INSERT INTO foo VALUES (1, "FooBar"), (2, "Testi"), (3, "JeeJee"); INSERT INTO bar VALUES (1, "FooBarOsoite"), (2, "TestiOsoite"), (3, "JeeJeeOsoite"); DELETE FROM foo WHERE id = 2; SELECT * FROM bar ORDER BY foo_id;
...tietenkään aina ei ole tarkoituksenmukaista tuhota kaikkia rivejä kaikista tauluista.
Alkemisti palaan yllä olevaan tulevaisuudessa mutta nyt minun on mietittävä tämä tehtävä loppuun. Siksi kysyn vielä todella typerän loppukysymyksen?
- Miten sijoitetaan oikein tämä uusi SQL-lause muun koodin sekaan?
$sql_varaustenmaara = "SELECT Varaus.Tapahtuma_Id, COUNT(Varaus.Tapahtuma_Id), Tapahtuma.tStatus FROM Varaus INNER JOIN Tapahtuma ON Varaus.Tapahtuma_Id = Tapahtuma.T_Id WHERE Tapahtuma.tStatus = 'Tapahtumat' GROUP BY Varaus.Tapahtuma_Id"; $kysely1 = mysql_query($sql_varaustenmaara) or die(mysql_error()); $sql_lauseke = "SELECT * FROM Tapahtuma ORDER BY tVuosi, tKuukausi, tPaiva, tNimi"; $kysely2 = mysql_query($sql_lauseke) or die(mysql_error()); echo '<table>'; while($rivi = mysql_fetch_row($kysely2)){ echo '<tr>'; echo " <td><a href='http://x.fi/?page_id=63&T_Id=" . $rivi[0] . "'>" . $rivi[1] . "</a></td> <td>" . $rivi[5] . " " . $rivi[2] . "." . $rivi[3] . "." . $rivi[4] . "</td> <td>" . $rivi[6] . "-" . $rivi[7] . "</td> <td>" . $rivi[8] . "</td> <td><strong>" . $rivi[10] . "</strong></td> <td></td> "; echo '</tr>'; } echo '</table>';
voiko tuohon kohtaan-> while($rivi = mysql_fetch_row($kysely2)){ <- saada jotenkin mukaan tuo toinen muuttuja. Tämäkin on taas näitä ihan perusteita, mutta miten tämä homma tehdään niin kuin ammattilainen? (minulla testi-sivu jossa testaan tätä koodia + MySQL-tietokanta, jonne syötän SQL-lauseita)
En nyt oikein hahmota, mihin tarvitset listaa varauksista, kun näytät olevan tulostamassa listaa tapahtumista.
Siis suunnilleen näin..
Tapahtuma 1 ---- tarve 2 ---- varaukset 5
Tapahtuma 2 ---- tarve 4 ---- varaukset 1
Tapahtuma 3 ---- tarve 4 ---- varaukset 0
Nähtävästi en voi laittaa kahta muuttujaa samoihin sulkuihin..
while($rivi = mysql_fetch_row($kysely1, $kysely2)){
Lisäys:
---------------------
Ahaa pahoittelut alkemisti, tietenkin lisään SQL-lauseeseen lisää dataa..
huoh..
SELECT Varaus.Tapahtuma_Id, COUNT( Varaus.Tapahtuma_Id ) , Tapahtuma.tStatus, Tapahtuma.T_Id, Tapahtuma.tNimi FROM Varaus INNER JOIN Tapahtuma ON Varaus.Tapahtuma_Id = Tapahtuma.T_Id WHERE Tapahtuma.tStatus = 'Tapahtumat' GROUP BY Varaus.Tapahtuma_Id
Ja nyt vissiin toimii?
Toimii täydellisesti, kiitos oikeasti erittäin paljon. Turhaan aloin miettimään kahta eri SQL-lausetta.
- nyt juuri tyylittelen hakua, että mahd. selkeä. (jälleen kerran ilman tätä sivua, foorumisteja jne.) olisi hankalaa. Mutta olen luvannut, että heti kun saan tämän projektin valmiiksi, niin aloitan putkan oppaista (alkeet)
Aihe on jo aika vanha, joten et voi enää vastata siihen.