Hei,
Viimeinen tehtäväni koskien työvuoronvaraus ohjelmaa olisi sen tarkistaminen perusteellisesti. En tullut ajatelleeksi että pelkkä tapahtuman poistaminen ei riitä vaan pitäisi poistaa myös varaus rivit (kyseinen tapahtuma)
else if($toiminto == "Poista" ) { $sql_lauseke = "DELETE FROM Tapahtuma WHERE T_Id = '" . $T_Id . "'"; if( !$kysely = mysql_query($sql_lauseke)) { echo "Virhe!"; } else { echo "Tiedot poistettu"; } }
Nyt SQL-lauseessa viitataan vain Tapahtuma tauluun, mutta voiko tehdä näin..
$sql_lauseke = "DELETE FROM Tapahtuma, Varaus WHERE T_Id = '" . $T_Id . "'";
Ei voi tehdä noin.
ok.. netistä tästä saa ristiriitaista tietoa (join)...
Tuota, miten saisin 2 muuttujaa tuonne sulkujen sisään (mielestäni pilkku ei riitä). if( !$kysely = mysql_query($sql_lauseke TOINEN MUUTTUJA ))
Et voi ajaa kahta kyselyä yhdellä mysql_querylla. Tarvitset kaksi mysql_querya.
Lisäys:
latenleffahylly kirjoitti:
ok.. netistä tästä saa ristiriitaista tietoa (join)...
No kysymyksessäsi et kysynyt, voiko käyttää JOINia, vaan länttäsit virheellisen kyselyn ja kysyit, toimiiko se. Monen taulun poistosta on esimerkkejä MySQL:n dokumentaatiossa. Tässä tapauksessa ei kuitenkaan ole mitään hyötyä käyttää monen taulun poistoa.
Kiitos linkistä, olen toki tuon ennenkin nähnyt, mutta ymmärtäminen on sitten aivan eri juttu.. tutkitaan..
Lisäys:
-------------------------------------------------------------------------------
For the first multiple-table syntax, only matching rows from the tables listed before the FROM clause are deleted.
The effect is that you can delete rows from many tables at the same time and have additional tables that are used only for searching:
-------------------------------------------------------------------------------
- Onko tähän touhuun pakko ottaa mukaan tuo 3-taulu? Jotenkin itse tekisin niin että poistaisin tietoa taulusta 1 ja 2 jossa sama id-numero!?
DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;
Ei sillä kolmannella taululla tehdä mitään, kun on vain kaksi taulua. :)
Ota pois ylimääräiset osat ihan huoletta.
..mutta hetkinen, eikö Metabolix juuri kertonut, että 1 sql-lausetta ei voi tehdä jossa poistetaan tietoa 2 taulusta.. hmm..
no aloitan jotenkin näin:
DELETE t1, t2 FROM t1 INNER JOIN t2
WHERE t1.id=t2.id;
Ja samalla kuin muokkaat tuota koodia, laita sisennykset kuntoon.
..luulin jo laittaneeni sisennykset kuntoon, onko jossain virallista mallia miten sisentää koodia oikein? (mielellään opettelisin)
Jos itse sisentäisin tuon, sisentäisin sen näin:
else if($toiminto == "Poista" ){ $sql_lauseke = "DELETE FROM Tapahtuma WHERE T_Id = '" . $T_Id . "'"; if( !$kysely = mysql_query($sql_lauseke)){ echo "Virhe!"; } else{ echo "Tiedot poistettu"; } }
Elikkäs samaan if lauseseen tuleva else samalle kohtaa kuin if:kin, myös sulkeet samalle johdalle. Itse suosin sitä tyyliä, että laittaa tuon eka sulun tuon if lauseen perään, mutta se toki on miten tykkäät.
Ps. On tuo jo parempi kuin ne edelliset.
heh, juu.. voisin ottaa tuon sinun tyylin käyttöön. Nyt teen juuri 2 testitaulua, joissa kokeilen tuota SQL-lausettani, jolla yritän poistaa tapahtuman 1 ja tapahtuman 1 kaikki varaukset.
thänks dartvaneri!
http://www.youtube.com/watch?v=lT8N85DRzZQ Katos tuo, tuosta voi olla vähän apua.
..katson myöhemmin, dankke!
----------------------------------------------------------
NYT:
DELETE Varaus, Tapahtuma FROM Varaus INNER JOIN Tapahtuma
WHERE Varaus.Tapahtuma_Id = 1;
- Miten saisin tuohon loppuun = Tapahtuma.T_Id <-sillä tavalla että tuo T_Id on 1. Tämä siis ihan testitarkoituksessa kun testaan phpMyAdminissa SQL-lauseen toimivuutta.
Oletkohan koskaan käyttänyt kyselyissä sanaa AND?
Noniin.. AND selkeytti asiaa kummasti.
Olen päätynyt seuraavaan koodin pätkään:
Tapahtuma_Id (1)
T_Id (1)
-------------------------------------------------------------------------------
$sql_lauseke = "DELETE Varaus, Tapahtuma FROM Varaus INNER JOIN Tapahtuma WHERE Varaus.Tapahtuma_Id = Tapahtuma.T_Id AND Tapahtuma.T_Id = " . $T_Id . "";
Ainakin testauksessa toimii, uskaltaako laittaa valmiiseen ohjelmaan, mielestäni kyllä.
Toinen "parempi" vaihtoehto on
INNER JOIN Tapahtuma ON Varaus.Tapahtuma_Id = Tapahtuma.T_Id WHERE Tapahtuma.T_Id = ...
Se ajaa ihan saman asian (en ole testannut).
latenleffahylly kirjoitti:
Ainakin testauksessa toimii, uskaltaako laittaa valmiiseen ohjelmaan...
Uskaltaa, kun testit on mennyt läpi... :)
PAHA ONGELMA JÄRJESTELMÄSSÄ!!!
---------------------------------------------------------------------------
Hei tuli se VIHO VIIMEINEN paha ongelma eteen! Eli kun halusin näyttää tapahtuman yhteydessä varattujen työvuorojen määrän niin ONGELMA!
Tapahtuma 1 ------------------tarve 5---------varattu 5
Tapahtuma 2 ------------------tarve 2---------varattu 1
Tapahtuma 3 ------------------tarve 10--------varattu 9
- Jos tapahtumaan ei ole vielä varattu työvuoroa -> tapahtuma ei näy listalla
$sql_lauseke = "SELECT Varaus.Tapahtuma_Id, COUNT(Varaus.Tapahtuma_Id), Tapahtuma.tStatus, Tapahtuma.T_Id, Tapahtuma.tNimi, Tapahtuma.tVuosi, Tapahtuma.tKuukausi, Tapahtuma.tPaiva, Tapahtuma.tViikonpaiva, Tapahtuma.tTarve, Tapahtuma.tAlkaa, Tapahtuma.tLoppuu, Tapahtuma.tSijainti FROM Varaus INNER JOIN Tapahtuma ON Varaus.Tapahtuma_Id = Tapahtuma.T_Id WHERE Tapahtuma.tStatus = 'Tapahtumat' GROUP BY Varaus.Tapahtuma_Id ORDER BY tVuosi, tKuukausi, tPaiva, tNimi";
..Olen pulassa. Jaksatteko katsoa miten muutan SQL-lausetta? Onko se edes mahdollista!?
latenleffahylly kirjoitti:
//.. "...AND Tapahtuma.T_Id = " . $T_Id . "";
Oothan varmasti tarkistanur $T_Id muuttujan oikeellisuuden(numerisuuden?), kun uskallat laitaa sen suoraan kyselyyn?
Harmittaa pahasti kun varausohjelma jo LIVEnä ja nyt sitten tuli tällanen ongelma. En osaa vastata dartvaneri sun kysymykseen. Luultavasti en??
Laitan koko koodin:
<?php MUODOSTETAAN TIETOKANTAYHTEYS... $sql_lauseke = "SELECT Varaus.Tapahtuma_Id, COUNT(Varaus.Tapahtuma_Id), Tapahtuma.tStatus, Tapahtuma.T_Id, Tapahtuma.tNimi, Tapahtuma.tVuosi, Tapahtuma.tKuukausi, Tapahtuma.tPaiva, Tapahtuma.tViikonpaiva, Tapahtuma.tTarve, Tapahtuma.tAlkaa, Tapahtuma.tLoppuu, Tapahtuma.tSijainti FROM Varaus INNER JOIN Tapahtuma ON Varaus.Tapahtuma_Id = Tapahtuma.T_Id WHERE Tapahtuma.tStatus = 'Tapahtumat' GROUP BY Varaus.Tapahtuma_Id ORDER BY tVuosi, tKuukausi, tPaiva, tNimi"; $kysely = mysql_query($sql_lauseke) or die(mysql_error()); echo '<table> <tr><th>tapahtuma</th><th>pvm</th><th>klo</th><th>sijainti</th><th>tarve</th><th></th><th></th></tr> <tr><td colspan="6"><div class="hrFull3"></div></td></tr>'; while($rivi = mysql_fetch_row($kysely)){ echo '<tr>'; echo "<td style='padding:3px 0px;'><a href='http://X.fi/?page_id=42&T_Id=" . $rivi[0] . "'>" . $rivi[4] . "</a></td> <td>" . $rivi[8] . " " . $rivi[7] . "." . $rivi[6] . "." . $rivi[5] . "</td> <td>" . $rivi[10] . "-" . $rivi[11] . "</td> <td>" . $rivi[12] . "</td> <td><strong>" . $rivi[9] . "</strong></td> <td><span class='red'><strong>" . $rivi[1] . "</strong></span></td> <td><a href='http://X.fi/?page_id=40&T_Id=" . $rivi[0] . "'><img src='http://X.fi/kuvat/info13.gif' alt='img' width='13' height='13' border='0' title='Avaa tapahtumainfo'></a></td> "; echo '</tr>'; } echo '</table>'; ?>
ONGELMA ON ERITTÄIN PAHA JA KIIREINEN KIITOS KAIKILLE AVUSTA!
Lisäys:
---------------------------------------------------------------------
Huom!
Varauksen poistaminen ok!
-> Nyt tuli paha ongelma kun yritän näyttää kaikki tapahtumat. Ei näy sellainen tapahtuma jossa varauksia 0 kpl
Lisäys:
------------------------------------------------------------------
Voisiko tässä kohtaan käyttää OR <- arvoa
WHERE Tapahtuma.tStatus = 'Tapahtumat'
WHERE Tapahtuma.tStatus = 'Tapahtumat' OR "Tapahtumien määrä 0"
Lisäys:
$sql_lauseke = "SELECT Varaus.Tapahtuma_Id, COUNT(Varaus.Tapahtuma_Id), Tapahtuma.tStatus, Tapahtuma.T_Id, Tapahtuma.tNimi, Tapahtuma.tVuosi, Tapahtuma.tKuukausi, Tapahtuma.tPaiva, Tapahtuma.tViikonpaiva, Tapahtuma.tTarve, Tapahtuma.tAlkaa, Tapahtuma.tLoppuu, Tapahtuma.tSijainti FROM Varaus INNER JOIN Tapahtuma ON Varaus.Tapahtuma_Id = Tapahtuma.T_Id WHERE Tapahtuma.tStatus = 'Tapahtumat' GROUP BY Varaus.Tapahtuma_Id ORDER BY tVuosi, tKuukausi, tPaiva, tNimi";
Lisäys:
Tästä SQL-lauseesta johtuen myöskään tapahtumaa ei voida poistaa - kun varauksia 0 kpl. Jos joku ehtisi tätä katsoa. Ongelma se että koko muu TYÖVUORON VARAUS Sovellus täysin kunnossa, mutta tähän SQL-lauseeseen pitäisi saada apua.
ONGELMAT:
- Kun varausten määrä 0 -> tapahtuma ei näy Tapahtumat-sivulla
- Tapahtumaa ei voi poistaa kun varausten määrä 0 kpl
huoh.. mikä avuksi. (sanon sen vielä että en halua kuormittaa teitä, mutta kun tässä lopputarkistuksessa eilen tekemäni päivitys aiheuttaakin tämän niin huh)
- luulin että tänään ei tarvitsisi koodata yöhön saakka.
Sinulla on nyt niin monta eri viestiketjua tästä samasta projektista, että ainakaan minä en ole kärryillä tietokantasi rakenteesta. Muistaakseni tuo "Tapahtuma.tStatus = 'Tapahtumat' " tarkoittaa tulossa olevaa tapahtumaa, johon voi vielä varata paikan. Halunnet siis kannasta ulos ne tapahtumat, joihin voi varata paikan ja joissa on varauksia tällä hetkellä nolla tai enemmän. Mikä ja missä tuo "Tapahtumien määrä" on, ja mitä se sisältää milläkin hetkellä? Oletko kokeillut INNER JOINin tilalla LEFT tai RIGHT JOIN? Noiden vaikutus tapauksessasi on tietokannan rakenteesta kiinni.
Et ole muistaakseni vieläkään lukenut mitään oppaita tähän liittyen. Ohjelmointiputkalla on aika hyvä perusopas, joka kyllä kannattaa sinunkin käydä läpi.
ohjelmointiputka kirjoitti:
Ongelmana on, että jos tuote ei esiinny lainkaan taulussa tarjoukset, sitä ei valita koskaan mukaan tauluista tuotteet ja tarjoukset muodostettaviin rivipareihin.
Ratkaisu on käyttää merkintää JOIN, joka on vaihtoehtoinen tapa yhdistää tietoa eri tauluista. Siinä voi käyttää lisämerkintöjä LEFT ja RIGHT, jotka tarkoittavat, että vasemmasta tai oikeasta taulusta otetaan mukaan myös rivit, joilla ei ole vastinetta toisessa taulussa.
Hei jaketsu aloitin uuden, TOIVOTTAVASTI viimeisen ketjun koskien ohjelmaani.. Kokeilin Joinit läpi, ei muutosta.. luin ja luen putkan opasta, mutta tämä ongelma on tähtitiedettä minulle..
Lisäys: Valoa tunnelin päässä kiitos RIGHT JOIN -parametrin...
Aihe on jo aika vanha, joten et voi enää vastata siihen.