Wil de juiste optie naar voren komen?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ruben

ruben

17/11/2009 12:23:00
Quote Anchor link
Stel voor een input type=""SELECT"
De options voor deze select zijn variabel en afhankelijk van een aantal gezette parameters.
Bijvoorbeeld:
Gezette eigenschappen: kort, dik, man.

De option tabel heeft 2 kolommen (OPTION en EIGENSCHAPPEN). Op deze manier kan je oneindig veel eigenschappen aan een optie hangen. Het nadeel is dat ik nu moeite heb met het filteren van de opties.

OPTION - EIGENSCHAPPEN

JAN - MAN
JAN - KORT
JAN - DUN

KEES - MAN
KEES - KORT
KEES - DIK

WIM - MAN
WIM - LANG
WIM - DIK

HANS - MAN
HANS - LANG
HANS - DUN

TRUUS - VROUW
TRUUS - KORT
TRUUS - DUN

De vraag is nu:
Toon de options die voldoen aan ALLE gezette PARAMETERS: kort, dik, man.

De option moet aan alle gezette eigenschappen voldoen.
Met een WHERE IN() clause kom ik er niet (dan komen alle mannen er door).
Ik heb ook een XOR geprobeerd. Lukte ook niet.

Wat is de beste manier om dit aan te pakken?
 
PHP hulp

PHP hulp

22/11/2024 18:31:14
 
Koen

koen

17/11/2009 12:36:00
Quote Anchor link
...
WHERE 'kort' IN eigenschappen AND 'dik' IN eigenschappen AND 'man' IN eigenschappen

...
je where werkt met 1 vergelijking tegelijk...
op deze manier komt alles in de vergelijking...
Gewijzigd op 01/01/1970 01:00:00 door koen
 
Ruben

ruben

17/11/2009 13:19:00
Quote Anchor link
koen schreef op 17.11.2009 12:36:
...
WHERE 'kort' IN eigenschappen AND 'dik' IN eigenschappen AND 'man' IN eigenschappen

...
je where werkt met 1 vergelijking tegelijk...
op deze manier komt alles in de vergelijking...


dat klinkt logisch, maar nu is de uitkomst leeg, omdat geen enkele record aan meerdere eigenschappen voldoet.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// -------------------------------------------------------------------------------------------------------------------------
// OPTIE STAP 1: welke parents vallen onder huidig $tabnr
// -------------------------------------------------------------------------------------------------------------------------    
        $haalParentsTab = ' SELECT * FROM  conf_SysOptParent WHERE Tab_ID = '.$tabnr.' ORDER BY Par_Order ASC ';        //
        $resultHaalParentsTab = mysql_query($haalParentsTab) or die (mysql_error());
// -------------------------------------------------------------------------------------------------------------------------
// OPTIE STAP 2: haal PARENT FILTER attributen
// -------------------------------------------------------------------------------------------------------------------------        
        while ( $ParentsTab = mysql_fetch_array($resultHaalParentsTab, MYSQL_BOTH))
        {   // print 'TabParent: '.$ParentsTab['Par_ID'].'<br />';
            $haalParFilOptAtt = "SELECT DISTINCT Att_ID
                                        FROM conf_Par_FilterAtt
                                        WHERE  conf_Par_FilterAtt.Par_ID = ".$ParentsTab['Par_ID']."
                                        ";//
            $resultHaalParFilOptAtt = mysql_query($haalParFilOptAtt) or die (mysql_error());
            $pfoa_list = ''; // $pfoa_array = array();
            while ( $pfoaRow = mysql_fetch_array($resultHaalParFilOptAtt, MYSQL_BOTH)){  
                        // stop de opties in een lijst
                        $pfoa_list .= $pfoaRow['Att_ID'].',';
                        
                        //array_push($pfoa_list,(($pfoaRow['Att_ID'])) );
            }  if($pfoa_list){print '$pfoa_list: '.$pfoa_list.'<br />';}    
            $vlag = 0;
            $pfoa_list = substr($pfoa_list, 0, -1); //    print '$pfoa_list: '.$pfoa_list.'<br />';
            if ($pfoa_list){ // array_count_values($pfoa_list)>= 1 // isset($pfoa_list[0])
             print 'ParentheeftFilterAtt: '.$ParentsTab['Par_ID'].'<br />';
                $c_list = '';
                $cc_list ='';    
                    // Current Attributes ----------------------------------------------------------------------------------------
                    $haalCurrentAtt = "SELECT    DISTINCT CurAtt_ID
                                                FROM conf_Sys_CurrentAtt
                                                WHERE Systems_Sys_ID = ".$MrkID."
                                                AND CurAtt_ID IN (".$pfoa_list.") ";
                    $resultHaalCurrentAtt = mysql_query($haalCurrentAtt) or die (mysql_error());
                    while ( $curRow = mysql_fetch_array($resultHaalCurrentAtt, MYSQL_BOTH)){  
                        // stop de attributen in een lijst
                        $c_list .= "conf_SysOpt_HasAtt.SysOpt_Attributes_Att_ID = ".$curRow['CurAtt_ID']." AND ";
                        $cc_list .= $curRow['CurAtt_ID'].",";
                    }      
                $c_list = substr($c_list, 0, -4);    print 'c_list: '.$c_list.'<br />';
                $cc_list = substr($cc_list, 0, -1);    print 'cc_list: '.$cc_list.'<br />';
                print '<br />---------------------------<br />';
                // -------------------------------------------------------------------------------------------------------------------------
                // OPTIE STAP 3: welke opties vallen onder de parents
                // -------------------------------------------------------------------------------------------------------------------------
                if ($c_list){$vlag = 1;}
            } // end if ($pfoa_list[0] != 0)
            if ($vlag){
                $haalOptions = "SELECT    DISTINCT     conf_SysOptions.Opt_ID, Parent_ID, Opt_Value
                                        FROM        conf_SysOptions
                                        INNER JOIN    conf_SysOpt_HasAtt
                                        ON            conf_SysOptions.Opt_ID = conf_SysOpt_HasAtt.SysOptions_Opt_ID
                                        WHERE        ".$c_list." AND Parent_ID = ".$ParentsTab['Par_ID']."
                                                                    
                                        ";    //    AND            SysOptions_Opt_ID NOT IN(".$bad.")        //     (SysOpt_Attributes_Att_ID = ".$c_list.")
            }
            else{  // dus als er geen Par_Filter is // print 'geen Par_Filter
                $haalOptions = "SELECT     DISTINCT     
                                        Opt_ID, Parent_ID, Opt_Value
                                        FROM conf_SysOptions
                                        WHERE Parent_ID = ".$ParentsTab['Par_ID']."
                                        ";
            } // end else // dus als er NIET een Par_Filter is
            $resultHaalOptions = mysql_query($haalOptions) or die (mysql_error());
            echo "<tr><th scope=\"row\" > <div id=\"pardiv\">".$ParentsTab['Par_Name'].":</div></th>\n";
            
            // ----------------------------------------------------------------------------------------------------------------------------------
            // ----------------------------------------------------------------------------------------------------------------------------------
            // OPTIE STAP 4: print de OPTIES
            // ----------------------------------------------------------------------------------------------------------------------------------
            // ----------------------------------------------------------------------------------------------------------------------------------
 
Koen

koen

17/11/2009 13:22:00
Quote Anchor link
en als je de OR gebruikt in plaats van de AND??\
edit:
en als je probeert met zowel upper als lowercase? of case-ongevoeligheid?
Gewijzigd op 01/01/1970 01:00:00 door koen
 
Ruben

ruben

17/11/2009 13:32:00
Quote Anchor link
OR geeft teveel terug. Als je bijvoorbeeld nog een overkoepelende eigenschap "MENS" hebt, krijg je met OR alles terug.
Dat is niet de bedoeling....
Best lastig :-)
 
Koen

koen

17/11/2009 13:56:00
Quote Anchor link
en de case gevoeligheid?
"man" is niet hetzelfde als "MAN"...
zet dan:
...
WHERE 'KORT' IN eigenschappen AND 'DIK' IN eigenschappen AND 'MAN' IN eigenschappen
...
 
Koen

koen

17/11/2009 13:56:00
Quote Anchor link
huh? dubbel post?? :S
ik deed 1 reply :S
maarja sorry pplz

btw, als je de eigenschappen in een variabele zet kan je in 1 keer strtoupper() gebruiken, hoef je nooit eigenhandig te controleren :P
Gewijzigd op 01/01/1970 01:00:00 door koen
 
Ruben

ruben

17/11/2009 14:06:00
Quote Anchor link
Nee, het heeft niet met case gevoeligheid te maken.
Het probleem zit 'm in de database structuur denk ik.

Misschien moet ik eerst de opties in een meerdimensionale array plaatsen.
Dan hebben de opties per optie meerdere eigenschappen.
Volg je me nog? :-)
 
Koen

koen

17/11/2009 14:07:00
Quote Anchor link
ik volg je nog, zie alleen niet in of dat veel verschil zou maken...
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.