Scoutnet vzw

We connect scouts!
Het is momenteel 17 Nov 2024 21:37

Alle tijden zijn UTC + 1 uur




Plaats een nieuw onderwerp Reageren op dit onderwerp  [ 9 berichten ] 
Auteur Bericht
BerichtGeplaatst: 14 Aug 2005 9:37 
Offline
 
 
Gebruikers-avatar

Geregistreerd: 24 Sep 2002 23:00
Berichten: 91
Ik ben bezig met een verjaardagskalender te maken van iedereen. Nu zijn er binnen onze tak bepaalde leiding die 2 functies hebben en dus ook 2 keer voorkomen in de ledenlijst (vb.: leiding givers en materiaalmeester). Nu dacht ik deze 2de keer er uit te filteren met DISTINCT, maar dat doet ie niet.
Het heeft volgens mij iets te maken met de velden `taknamen_Naam` en `leiding_Email`, want als ik deze weg laat, dan is het wel goed.

Code:
$sql = "SELECT DISTINCT `ledenlijst_Lidnummer`, `ledenlijst_Naam`, `ledenlijst_Voornaam`, `ledenlijst_Geboortedatum`, `taknamen_Naam`, `leiding_Email`  FROM `ledenlijst` LEFT JOIN `taknamen` ON `ledenlijst_Functiecode` = `taknamen_Code` LEFT JOIN `leiding` ON `ledenlijst_Lidnummer` = `leiding_Lidnummer` WHERE `ledenlijst_Geboortedatum` LIKE '%%".$today."' ORDER BY `ledenlijst_Geboortedatum`";


alvast bedankt.


Omhoog
 Profiel  
 
 Titel:
BerichtGeplaatst: 15 Aug 2005 16:28 
Offline
Site Admin
Site Admin

Geregistreerd: 30 Sep 2002 23:00
Berichten: 1806
query al eens laten lopen in phpmyadmin ?

wat is daar dan de foutmelding?


Omhoog
 Profiel  
 
 Titel:
BerichtGeplaatst: 15 Aug 2005 18:38 
Offline
 
 
Gebruikers-avatar

Geregistreerd: 24 Sep 2002 23:00
Berichten: 91
sorry, vorige boodschap was niet heel duidelijk.

Hij doet het wel, maar leiding met 2 functies komes ook 2 keer voor!


Omhoog
 Profiel  
 
 Titel:
BerichtGeplaatst: 15 Aug 2005 19:07 
Offline
 
 
Gebruikers-avatar

Geregistreerd: 16 Sep 2004 23:00
Berichten: 22
ik persoonlijk los dat op door een extra rij toe te voegen in de tabel user.
ik noem die 'override'. Als er dan een leiding 2 functies heeft vul ik de hoogste functie daar in ..en laat telkens ook even checken of dat veld is ingevuld...
het is niet de beste methode, maar ze werkt best OK


bij je query ... Je gebruilt distinct om dubbele rijen te filteren, maar je kijkt naar alle gegevens .. dus dan zijn alle rijen toch verschillend.

als je bvb distinct op alleen het lidnummer zou doen zou dat zonder probleem werken. dus als je taknaam (kapoenen leiding of bvb materiaal meester) niet moet doorgeven .. zou ik dat ook niet doen.

weet nie of da wa duidelijk is wat ik wil zeggen ...


Omhoog
 Profiel  
 
 Titel:
BerichtGeplaatst: 15 Aug 2005 20:24 
Offline
 
 
Gebruikers-avatar

Geregistreerd: 23 Apr 2004 23:00
Berichten: 30
je zou ook uw database ontwerp kunnen aanpassen, een beetje normaliseren zoals dat zo mooi heet
dat zorgt er voor dat je nooit dubbele data hebt

hoe het er bij jullie (misschien) uitziet:
tabel: leiding
lidnummer, naam, adres, tak, functie
001, jos, brussel, jongverkenners
001, jos, brussel, materiaalmeester

hoe het beter kan:
tabel leiding:
naam, adres,...

tabel takken
id - tak
1 - kapoenen
2 - kabouters
...

tabel leidingtakken
tak_id - leidinglidnummer
5 - 001

tabel functies
id - functie
1 - groepsleiding
2 - materiaalmeester

tabel leidingfuncties
functie_id - leidinglidnummer
1 - 001
2 - 001

eventueel zou je er telkens ook nog het werkjaar kunnen bijzetten (zoals het bij ons is) dan kan je ook nog de wie is wie's op vragen van vorige jaren (bij ons nog niet het geval)

hopelijk ben je hier mee geholpen, 't is natuurlijk wel een hele aanpassing die je waarschijnlijk niet wil maken, 't bied wel veel voordelen

groentjes
Thijs
http://scoutslede.be/


Omhoog
 Profiel  
 
 Titel:
BerichtGeplaatst: 16 Aug 2005 7:28 
Offline
 
 
Gebruikers-avatar

Geregistreerd: 24 Sep 2002 23:00
Berichten: 91
hmmm, alle gegevens worden uit de lendenlijst opgehaald.
Deze ledenlijst kan men uploaden (csv-bestand) en dit word dan automatisch in de database gezet. kan eerst wel alle lidnummers in een array zetten, dan deze array afgaan en dan alle gegevens uit de database halen. Maar dat is ook niet proper.
Het zou toch met DISTINCT moeten lukken volgens mij?


Omhoog
 Profiel  
 
BerichtGeplaatst: 16 Aug 2005 10:09 
Offline
Site Admin
Site Admin
Gebruikers-avatar

Geregistreerd: 17 Jul 2002 23:00
Berichten: 1522
Woonplaats: Wetteren
sn0904 schreef:
Het heeft volgens mij iets te maken met de velden `taknamen_Naam` en `leiding_Email`, want als ik deze weg laat, dan is het wel goed.

Klopt het dat de records van personen met twee functies net op dat veld verschillen?

Dit staat op de website van MySQL:
Citaat:
Note that because DISTINCT may use GROUP BY, you should be aware of how MySQL works with columns in ORDER BY or HAVING clauses that are not part of the selected columns. See Section 12.10.3, “GROUP BY with Hidden Fields”.

Ik heb DISTINCT zelf nog nooit gebruikt, maar het lijkt mij ook het beste om eerste alle leden één keer te selecteren (met een distinct enkel op lidnummer), en nadien van die leden de gegevens op te vragen.

Op onze site is het opgelost door een extra veld "verjaardag" toe te voegen. Daarin wordt bij het uploaden van een ledenlijst enkel iets ingevuld (bijvoorbeeld 1018 voor 18 oktober) als dat veld voor dit lid nog niet voorkomt in de tabel. Jarigen per maand of tussen een bepaalde periode (bijvoorbeeld tussen vandaag en binnen 7 dagen) is dan een makkie.

De oplossing van thijsdj is wat meer werk, maar technisch wel de beste (leve informatiesystemen :wink:).

To


Omhoog
 Profiel  
 
 Titel:
BerichtGeplaatst: 16 Aug 2005 10:49 
Offline
 
 
Gebruikers-avatar

Geregistreerd: 31 Jul 2002 23:00
Berichten: 236
De SELECT DISTINCT zal enkel rijen niet tonen die volledig identiek zijn aan andere bestaande.
Dus indien er een persoon is met verschillende 'taknamen_Naam` of `leiding_Email` -en deze velden zitten in de SQL- zal deze 2 maal getoond worden.
Je kan eventueel wel -als het voor die rij niet uitmaakt welke tak of email getoond word- gebruik maken van de 'MAX' of 'MIN' functie.

De oplossing om eerst de lidnummers op te halen en dan de rest van de gegevens brengt hier niet zoveel op, vermits je het probleem verlegt en bij de 2e SQL twee rijen voor die persoon krijgt.


Persoonlijk werk ik met een kolom "Dubbel" die ik weglaat in de select

esl,

Caygull


Omhoog
 Profiel  
 
 Titel:
BerichtGeplaatst: 17 Aug 2005 9:13 
Offline
 
 
Gebruikers-avatar

Geregistreerd: 24 Sep 2002 23:00
Berichten: 91
Heb het opgelost door eerst een keer enkel de lidnumers op te halen (distinct) en daarnaa binnen de while lus de rest van de gegevens op te halen en LIMIT 1 gebruikt.

Is niet de properste, maar wel de gemakkelijkste voor mij.
Code:
$sql = "SELECT DISTINCT `ledenlijst_Lidnummer` FROM `ledenlijst` WHERE `ledenlijst_Geboortedatum` LIKE '%%".$today."' ORDER BY `ledenlijst_Geboortedatum`";
         $result = $db->query($sql);
         if (DB::isError($result)){
            die ($result->getMessage());
         }
while($row = $result->fetchRow(DB_FETCHMODE_ASSOC)){
            $sql2 = "SELECT `ledenlijst_Naam`, `ledenlijst_Voornaam`, `ledenlijst_Geboortedatum`, `taknamen_Naam`, `leiding_Email`  FROM `ledenlijst` LEFT JOIN `taknamen` ON `ledenlijst_Functiecode` = `taknamen_Code` LEFT JOIN `leiding` ON `ledenlijst_Lidnummer` = `leiding_Lidnummer` WHERE `ledenlijst_Lidnummer` = '".$row['ledenlijst_Lidnummer']."' ORDER BY `ledenlijst_Geboortedatum` LIMIT 1";
            $result2 = $db->query($sql2);
            if (DB::isError($result2)){
               die ($result2->getMessage());
            }
            $row2 = $result2->fetchRow(DB_FETCHMODE_ASSOC);


Omhoog
 Profiel  
 
Berichten weergeven van de afgelopen:  Sorteer op  
Plaats een nieuw onderwerp Reageren op dit onderwerp  [ 9 berichten ] 

Alle tijden zijn UTC + 1 uur


Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 39 gasten


U mag geen nieuwe onderwerpen plaatsen in dit forum
U mag geen reacties plaatsen op onderwerpen in dit forum
U mag uw berichten niet wijzigen in dit forum
U mag uw berichten niet verwijderen in dit forum
U mag geen bijlagen plaatsen in dit forum

Zoeken naar:
Ga naar:  
cron
Powered by phpBB® Forum Software © phpBB Group
Vertaald door phpBBservice.nl.