The effort will be made by the computer, but if you have a large amount of data, take a coffee in the meantime.
/* ===== TAKEN FROM PHP.net ====== */
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
$query = "Select question, mark from table"; // your query
$arrayData = array();//set an empty array to populate
if ($result = $mysqli->query($query)) {
/* fetch associative array */
while ($row = $result->fetch_assoc()) {
//for calculation purpose, we force the Mark field to be an integer
$arrayData[$row['question']] = (int)$row['mark']; //populate array with sql results
}
/* free result set */
$result->free();
}
/* close connection */
$mysqli->close();
Now we have the SQL results in the $arrayData
variable.
Like this:
Array("q1"=>4, "q2"=>4, "q3"=>8)
and so on...
Let's go.
$targetSUM = 16;
//First of all, remove any doubt and see
//if the sum of the entire array is the same as our target
if($targetSUM === array_sum($arrayData)){
print_r($arrayData);
die();
}
$i=0;
$results = array();
foreach($arrayData as $questionA=>$markA){
$thisCycle = array($questionA=>$markA);
foreach($arrayData as $questionB=>$markB){
if ($questionA === $questionB) continue; // avoid sum SUM itself
$thisCycle[$questionB] = $markB;
$thisCycleSUM = array_sum($thisCycle);
switch(true){
case $thisCycleSUM < $targetSUM: //if results not reach our target, go on
continue;
break;
case $thisCycleSUM === $targetSUM: //if results match, store and go on
$results[$i] = $thisCycle;
$thisCycle = array($questionA=>$markA);
break;
case $thisCycleSUM > $targetSUM: //if results exceeds, remove last element and go on
unset($thisCycle[$questionB]);
break;
}
}
// Sorting procedure to avoid same combinations and no-combination
if(isset($results[$i])){
ksort($results[$i]);
$results[implode(array_keys($results[$i]))] = $results[$i];
unset($results[$i]);
$i++;
}
}
$results = array_values($results);
print_r($results);
DEMO HERE