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?
...
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...
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]
// -------------------------------------------------------------------------------------------------------------------------
// 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
// ----------------------------------------------------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------------------------------------------------
en als je de OR gebruikt in plaats van de AND??\
edit:
en als je probeert met zowel upper als lowercase? of case-ongevoeligheid?
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 :-)
en de case gevoeligheid?
"man" is niet hetzelfde als "MAN"...
zet dan:
...
WHERE 'KORT' IN eigenschappen AND 'DIK' IN eigenschappen AND 'MAN' IN eigenschappen
...
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
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? :-)
ik volg je nog, zie alleen niet in of dat veel verschil zou maken...

Reageren