Vraag & Antwoord

Webprogrammeren & scripting

[PHP/MySQL] Hoe pak ik dit slimmer aan? (vervolg 2..)

15 antwoorden
  • Bij het script waar het omgaat moeten mensen zich inschrijven voor activiteiten. Elke activiteit staat in de DB, met bijhehorende kollomen voor allerlei info over de activiteit zelf. Maar: Hoe geef ik nu aan wie zich voor die desbetreffende activiteit hebben opgegeven? Op dit moment heb ik een veld met daarin de ID's van de ingeschreven mensen (ID's die natuurlijk overeenkomen met die in de Accounts-tabel), gescheiden door een spatie... Dit werkt goed, m.b.v. PHP kun je die waardes heel makkelijk uit elkaar halen en dan de juiste gebruikers-info uit de Accounts-tabel halen... Maar kan dit niet slimmer? Het max-aantal inschrijvingen verschilt enorm, van 3 tot 150... Wat nu bijvoorbeeld erg lastig is, is als iemand moet worden uitgeschreven... Dat gaat wel, maar nogal omslachtig m.b.v. PHP... Samengevat: Hoe zet ik dit slimmer in de DB? :wink:
  • Een iets andere indeling van je database kan hier wellicht het werken een stuk eenvoudiger maken. Zoek eens op het forum/internet naar 'normaliseren'. De deelnemers per activiteit in een aparte tabel zetten bijvoorbeeld: [b:a8d355b793]Activiteiten[/b:a8d355b793] Id, naam, omschrijving, etc [b:a8d355b793]Accounts[/b:a8d355b793] Id, naam, ww, etc [b:a8d355b793]Deelname[/b:a8d355b793] activiteit_id, account_id Controleren van het aantal inschrijvingen kan dan door: $sql = "SELECT count(*) FROM Deelname WHERE activiteit_id = 'waarde';"; Verwijderen gaat natuurlijk nog makkelijker $sql = "DELETE FROM Deelname WHERE activiteit_id = 'waarde' AND account_id = 'waarde2';"; En om alle deelnemers van een activiteit te krijgen: $sql = "SELECT account_id FROM Deelname WHERE activiteit_id = 'waarde';"; $tmp = mysql_query($sql); while ($deelnemer = mysql_fetch_array($tmp)) { doe iets met $deelnemer['account_id']};
  • [quote:592125d285="E gozeling"]Een iets andere indeling van je database kan hier wellicht het werken een stuk eenvoudiger maken. Zoek eens op het forum/internet naar 'normaliseren'. De deelnemers per activiteit in een aparte tabel zetten bijvoorbeeld: [b:592125d285]Activiteiten[/b:592125d285] Id, naam, omschrijving, etc [b:592125d285]Accounts[/b:592125d285] Id, naam, ww, etc [b:592125d285]Deelname[/b:592125d285] activiteit_id, account_id Controleren van het aantal inschrijvingen kan dan door: SELECT count(*) FROM Deelname WHERE activiteit_id = 'waarde'; Verwijderen gaat natuurlijk nog makkelijker DELETE FROM Deelname WHERE activiteit_id = 'waarde' AND account_id = 'waarde2'; En om alle deelnemers van een activiteit te krijgen: SELECT account_id FROM Deelname WHERE activiteit_id = 'waarde';[/quote:592125d285]Dank je! Deze methode zal ik even opslaan/testje doen.. Nadeel is alleen dat we al op 2.300+ inschrijvingen zitten dus omzetten word mss een te grote klus. Maar het is een schoolwebsite, dus aan het einde van het schooljaar zal ik het zo eens gaan doen :lol:
  • Naast een oplossing voor de punten die jij aangeeft zitten er nog een paar voorbeelden aan het voorbeeld dat ik gaf. Het is met de drie-tabellen oplossing mogelijk om per deelnemer per activiteit commentaar toe te voegen. (extra kolom in de tabel 'deelname'). Bijvoorbeeld een vakje voor opmerkingen. (al betaald, nog niet betaald, neemt 2 introducees mee, etc.)
  • Oke ik ben ermee aan de slag gegaan, als test.. Nu een volgende vraag: Ik heb dus jou tabel systeem, maar nu wil ik de inschrijvingen voor (bijvoorbeeld) activiteit '3' zien... Maar ik kan natuurlijk aan de gebruiker moeilijk een lijst met ID's laten zien :wink: . Dit kan natuurlijk via PHP... (while lus die steeds voor elk ID de info van de gebruiker uit de account-info uit de andere tabel haalt) Nadeel hieraan is dat het best wel 'tijdrovend' is, dat is een groot woord... maar als ik op die manier naar 210 mensen een mailtje stuur (herrinerings mail, tis een systeem voor een school en leerlingen vergeten nogal snel :lol:) duurt dat al snel 25 sec... Als het langer dan 30 sec duurt geeft de server een time-out.. en dat wil ik niet. [b:4e19539d07]Om een lang verhaal kort te maken:[/b:4e19539d07] Kan ik MySQL niet meteen de info met de bijbehorende ID's uit de account-tabel laten halen?
  • Daar bestaat de JOIN syntax voor. Voorbeeld (korte) uitleg: http://www.w3schools.com/sql/sql_join.asp (meer voorbeelden uiteraard online te vinden) [code:1:0aced5d968] SELECT a.naam, a.email FROM accounts AS a INNER JOIN deelname AS d ON a.id = d.account_id WHERE d.activiteit_id = '<id van gekozen activiteit>'; [/code:1:0aced5d968] (Syntax) fouten voorbehouden.
  • Vervolg 2: Okeej ik heb nu dit systeem geinplementeerd maar ik kom een nieuw probleem tegen... Als ik alle activiteiten ga weergeven moet er ook weergegeven worden hoeveel mensen er al ingeschreven hebben.. Maar dit staat nu in die andere tabel (Deelname).. Ik zou begod niet weten hoe ik dat moet doen.. Waarschijnlijk met COUNT() maar ik zou niet weten hoe.. (hij moet dus van elke activiteit zeggen hoeveel inschrijvingen er al zijn voor die activiteit in Deelname, kortgezegd) Iemand die daar een oplossing voor heeft?
  • [url=http://www.w3schools.com/sql/default.asp]SQL cursus?[/url] of: http://www.geocities.com/SiliconValley/Vista/2207/sql1.html http://www.1keydata.com/sql/sql.html http://sqlzoo.net/ http://www.baycongroup.com/tocsql.htm [code:1:e61ae969a7]SELECT a.*, COUNT(d.account_id) AS aantal FROM Activiteiten AS a, Deelname AS d WHERE a.act_id=d.act_id GROUP BY d.account_id[/code:1:e61ae969a7]
  • Die versie had ik dus ook al gevonden in de cursusen.. Alleen het probleem is dat hij ook de activiteiten waarvoor 0 inschrijvingen zijn moet weergeven.. En dat doet ie nu niet.. Alleen waarvoor hij iets kan tellen.. Ik heb dit geprobeerd, maar dat was te voorspellen dat niet zou werken: [code:1:39665549a3]SELECT a. * , COUNT( d.ActiviteitId ) AS aantal FROM RoosterActiviteiten AS a, RoosterInschrijvingen AS d WHERE d.ActiviteitId = a.id OR (aantal = 0) GROUP BY d.ActiviteitId [/code:1:39665549a3]
  • [code:1:2a371da85e]SELECT a.*, COUNT(d.account_id) AS aantal FROM Activiteiten AS a LEFT JOIN Deelnames d ON a.act_id=d.act_id GROUP BY d.account_id[/code:1:2a371da85e] google maar s op LEFT JOIN als je wilt weten wat ie doet
  • Uiteindelijk bleek het iets aangepast te moeten worden, maar nu werkt met perfect :D Dank voor de hulp, ook al waren deze vragen mss een beetje basic.. [code:1:14e813c6cc]SELECT ActTable. * , COUNT( InschrTable.LeerlingId ) AS Inschrijvingen FROM RoosterActiviteiten AS ActTable LEFT JOIN RoosterInschrijvingen AS InschrTable ON ActTable.id = InschrTable.ActiviteitId WHERE ( ActTable.Activiteit LIKE '%%' AND ActTable.Domein LIKE '%%' AND ActTable.Datum BETWEEN '2006-01-23' AND '2006-03-22' ) GROUP BY ActTable.id ORDER BY ActTable.Datum ASC, ActTable.Tijd ASC[/code:1:14e813c6cc]
  • LIKE %% doet volgens mij helemaal niets, alles voldoet volgens mij aan %% die 2 regels kan je dan maar beter weglaten
  • [quote:9a83f153e5="marientje"]LIKE %% doet volgens mij helemaal niets, alles voldoet volgens mij aan %% die 2 regels kan je dan maar beter weglaten[/quote:9a83f153e5]Die zijn er omdat mensen ook kunnen zoeken, dan word die (met PHP) ingevuld.. Anders moet ik daar een aparte SQL voor maken.. Beetje lui deze oplossing maar toch..
  • [quote:9610582724="marientje"][url=http://www.w3schools.com/sql/default.asp]SQL cursus?[/url] [code:1:9610582724]SELECT a.*, COUNT(d.account_id) AS aantal FROM Activiteiten AS a, Deelname AS d WHERE a.act_id=d.act_id GROUP BY d.account_id[/code:1:9610582724][/quote:9610582724] En als jij nou eens een SQL cursus had gevolgd dan had je geweten dat deze query eigenlijk de grootst mogelijke onzin is ;) In group by queries kan je alleen de velden terugvragen waarop wordt gegroepeerd of welke zijn opgenomen in een aggregate functie. Of beter gezegd: alleen die gegevens geven zinvolle data terug. Tenminste, dat is zo in "normale" SQL. Dat MySQL deze syntax wel ondersteund en ook nog data teruggeeft is een tweede. Ik vind het overigens nog steeds onzinnig gedrag van MySQL.
  • edit: nee dat kan ik niet maken hier...

Beantwoord deze vraag

Weet jij het antwoord op deze vraag? Registreer of meld je aan met je account

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.