Wil de juiste optie naar voren komen?
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?
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
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...
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)
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
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
// ----------------------------------------------------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------------------------------------------------
// 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
// ----------------------------------------------------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------------------------------------------------
edit:
en als je probeert met zowel upper als lowercase? of case-ongevoeligheid?
Gewijzigd op 01/01/1970 01:00:00 door koen
Dat is niet de bedoeling....
Best lastig :-)
"man" is niet hetzelfde als "MAN"...
zet dan:
...
WHERE 'KORT' IN eigenschappen AND 'DIK' IN eigenschappen AND 'MAN' IN eigenschappen
...
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
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? :-)
ik volg je nog, zie alleen niet in of dat veel verschil zou maken...