2011-03-08 9 views
0

J'ai une table de produits avec une colonne nommée "featured" (int, 0 par défaut). Lorsque j'ajoute un produit en vedette sur la première position, il ajoute la valeur "1" dans cette colonne, "2" pour la deuxième position et ainsi de suite. . Mon problème est quand je n'ai pas un produit sur la première ou la deuxième position mais seulement sur le troisième ou le deuxième il va "promouvoir" ce troisième produit sur la première position. Existe-t-il un moyen de remplir les positions non promues (par exemple: premier ou deuxième) avec les produits de la requête de sélection par défaut et de montrer le produit vedette avec la valeur "vedette" de 3 sur la troisième position?ordre par featured - php mysql

Répondre

1

Fondamentalement, vous avez besoin de garder une trace de ce que vous avez présenté slots remplis et ceux que vous devez remplir. Vous pouvez également avoir à vous inquiéter si votre liste n'est pas assez longtemps pour que toutes vos machines à sous favorites ... Vous pouvez faire quelque chose comme:

$qh = mysql_query('SELECT featured, ... FROM products ORDER BY featured DESC'); 

//get the featured rows first; 
while($row = mysql_fetch_assoc($qh)) { 
    if($row['featured'] > 0) { 
     $featured[$row['featured']] = $row; 
    } else { 
     break; 
    } 
} 
//values were inserted in reverse, so reorder them. 
ksort($featured); 

$idx = 1; 
//make sure there was a next row from above while loop 
if($row) { 
    do { 
     //print any featured rows that should appear at position $idx 
     while(isset($featured[$idx])) { 
      printRow($featured[$idx]); 
      $idx++; 
     } 
     //$idx doesn't have a featured row, so print a non-featured one 
     printRow($row); 
     $idx++; 
    } while($row = mysql_fetch_assoc($qh)); 
} 

//print any remaining featured rows 
foreach($featured as $key => $value) { 
    if($featured >= $idx) { 
     printRow($value); 
    } 
} 
+0

Vous avez le problème que vous sélectionnez tous les produits, et votre keysort fera juste la même chose que mysql orderby et O WH en vedette> 0. Pas besoin de trier cela en php imo. Aussi, je ne vois pas comment vous remplissez les lacunes avec des produits normaux? – Erik

+0

@Erik, si j'ai un 'WHERE en vedette> 0', alors je n'aurai aucun des produits non-vedette. Certes, je pourrais être plus créatif avec le 'ORDER BY' de sorte qu'il n'est pas nécessaire de réorganiser les clés (quelque chose comme' ORDER BY featured = 0, featured'). Je comble les lacunes dans la boucle do-while. L'intérieur alors que les imprimés en vedette les gars jusqu'à ce qu'un écart est trouvé, puis j'imprime un non-vedette après le moment. Dans le cas où ce n'est pas clair, tous les index du tableau '$ featured' n'ont pas de valeur. – jswolf19

+0

Bien sûr, ce serait plus compliqué si plusieurs éléments avaient la même valeur, mais cela n'a pas été mentionné dans la question. – jswolf19

0

En fait, c'est vraiment facile. Il suffit de faire la requête de sélection, et vous demandez également en vedette. En php, vous vérifiez le premier numéro en vedette. Si c'est plus grand que 1 alors vous sélectionnez les produits normaux à la place. Un petit exemple:

$resultsOther = array(); 
$result = executeQuery('SELECT featured, name, ~~ FROM products WHERE featured > 0 ORDER BY featured'); 
if($results[0]['featured'] > 1) { 
    $resultsOther = // get other products with a limit on the query 
} 
foreach ($resultsOther as $r) { 
    print_r($r); 
} 
foreach ($results as $r) { 
    print_r($r); 
} 

Une autre façon que vous pouvez faire est:

// This will select max 5 items and if there are not enough featured items it also selects non featured. 
$results = execute('SELECT featured, ~~ FROM products ORDER BY featured DESC LIMIT 5'); 
while ($result = array_pop($results)) { 
    print_r($result); // verander deze door de functie om de producten te tonen. 
}