2010-06-29 8 views
1

J'ai une requête que je veux trier par ordre alphabétique, mais l'astuce est que je veux que le tri traite deux colonnes de manière égale. Par exemple, si la première rangée de first_col est égal à apple et la deuxième rangée de second_col est égal à aardvark Je veux la valeur dans la deuxième rangée de second_col à la liste avant la valeur dans la première rangée de first_col. Une valeur (pas NULL ou '') existera toujours dans chaque ligne de second_col, mais la valeur dans first_col peut être ''. J'espère avoir expliqué cela assez bien. Je ne me soucie pas si je dois utiliser MySQL ou PHP pour cela, mais une fois triés, le tableau est lu et répercuté dans un tableau HTML. Des pensées?Tri d'une requête MySQL avec ORDER BY ou avec des fonctions de tri PHP

EDIT

C'est ce que j'ai pour le code en ce moment. Dans ma requête MySQL j'ai besoin de b_name et l_name pour être égal. La colonne b_name n'a pas toujours de valeur. Lorsque je mets les valeurs dans le tableau, il est basé sur l'existence de b_name. Si b_name n'existe pas, les f_name et l_name sont combinés pour remplacer b_name.

   $query = "SELECT * FROM customers ORDER BY b_name, l_name"; 
       $result = mysql_query($query); 
       mysql_close($link); 

       $num = mysql_num_rows($result);       

       for ($i = 0; $i < $num; $i++){ 

        $row = mysql_fetch_array($result); 

        $class = (($i % 2) == 0) ? "table_odd_row" : "table_even_row"; 

        if($row[b_name]!=''){ 
         echo "<tr class=".$class.">"; 

          echo "<td><a href=Edit_Customer.php?c_id=".$row[c_id].">".$row[c_id]."</a></td>"; 
          echo "<td><a href=Edit_Customer.php?c_id=".$row[c_id].">".$row[b_name]."</a></td>"; 
          echo "<td><a href=Edit_Customer.php?c_id=".$row[c_id].">".$row[phone]."</a></td>"; 

         echo "</tr>"; 

        } 

        else{ 
         echo "<tr class=".$class.">"; 

          echo "<td><a href=Edit_Customer.php?c_id=".$row[c_id].">".$row[c_id]."</a></td>"; 
          echo "<td><a href=Edit_Customer.php?c_id=".$row[c_id].">".$row[f_name]." ".$row[l_name]."</a></td>"; 
          echo "<td><a href=Edit_Customer.php?c_id=".$row[c_id].">".$row[phone]."</a></td>"; 

         echo "</tr>"; 

        } 


       } 

      ?>  

     </table> 
+0

Si la première ligne est ' « a », « b'' et la deuxième rangée est' » b « » a'' et les deux colonnes sont traitées de façon égale, laquelle de ces lignes doit venir en premier lieu et Pourquoi? –

+0

Montrez-nous la requête.UNION –

Répondre

0
+1

la sélection de toute la table est plus rapide? bien bien. Je souhaite bonne chance à votre serveur. –

+0

@Col. Sharpnel, vous devriez jeter un autre coup d'oeil à la requête dans ma réponse. Je ne sélectionne pas toute la table, seulement les champs dont j'ai besoin. – ubiquibacon

+1

Lol vous êtes gars drôle :) champs ne signifie rien tant que les lignes sont tout. –

1

Votre question n'est pas tout à fait claire, mais vous pouvez essayer d'utiliser comme votre clause ORDER BY:

ORDER BY LEAST(first_col, second_col) 

Démonstration:

CREATE TABLE table1 (first_col VARCHAR(100) NOT NULL, second_col VARCHAR(100) NOT NULL); 
INSERT INTO table1 (first_col, second_col) VALUES 
('a', 'b'), 
('d', 'e'), 
('f', 'c'); 

SELECT first_col, second_col 
FROM table1 
ORDER BY first_col, second_col; 

a b 
d e 
f c 

SELECT first_col, second_col 
FROM table1 
ORDER BY LEAST(first_col, second_col); 

a b 
f c 
d e 
+0

, mais cela ne fonctionne pas car le first_col' est toujours prioritaire, donc tout ce qui est 'second_col' se termine le bas de la liste. – ubiquibacon

+0

@typoknig: Selon votre question, vous avez écrit 'ORDER BY first_col, second_col'. Ce n'est pas pareil. –

+0

Le résultat est le même, j'ai essayé les deux façons. – ubiquibacon

2

Si vos tables sont très similaires, vous pouvez Pour ce faire, j'ai une table test_a avec 2 colonnes id et name

(SELECT * FROM test_a a1) 
UNION ALL 
(SELECT * FROM test_a a2) 
ORDER BY name DESC 
+0

Je pense que c'est la meilleure solution. – mRt

1

Essayez

ORDER BY CONCAT(b_name, l_name) 

ou (si vos champs sont NULL lorsque VIDES)

ORDER BY COALESCE(b_name, l_name) 
0

Comme on dit ci-dessus, UNION ALL est votre ami, et, bien sûr , si vous n'avez qu'une seule table, vous pouvez toujours le faire:

(SELECT field1 AS name FROM TABLE1) 
UNION ALL 
(SELECT field2 AS name FROM TABLE1) 
ORDER BY name DESC 

Donc, vous demandez deux lignes différentes dans la même table, et en le classant comme un seul. Merci à tous pour votre aide les gars, mais aucune de vos réponses ne m'a permis de trier les données et de les répercuter correctement dans le tableau HTML une fois triées. Un UNION aurait pu fonctionner, mais je pense que ma solution a été plus rapide pour ce qui est de tout comprendre.

   $query = "SELECT c_id, b_name, l_name, f_name, phone FROM customers"; 
       $result = mysql_query($query); 
       mysql_close($link); 

       $num = mysql_num_rows($result); 

       for ($i = 0; $i < $num; $i++){ 
        $row = mysql_fetch_array($result); 

        if($row[b_name]!=''){ 
         $new_result[$i]['c_id'] = $row[c_id]; 
         $new_result[$i]['c_name'] = $row[b_name]; 
         $new_result[$i]['phone'] = $row[phone]; 
        } 

        else{ 
         $new_result[$i]['c_id'] = $row[c_id]; 
         $new_result[$i]['c_name'] = $row[l_name].", ".$row[f_name]; 
         $new_result[$i]['phone'] = $row[phone];       
        } 
       }      

       foreach ($new_result as $key => $row) { 
        $c_id[$key] = $row['c_id']; 
        $c_name[$key] = $row['c_name']; 
        $phone[$key] = $row['phone']; 
       } 

       array_multisort($c_name, SORT_ASC, $c_id, SORT_ASC, $new_result); 

       for ($i = 0; $i < $num; $i++){ 

        $class = (($i % 2) == 0) ? "table_odd_row" : "table_even_row"; 

        echo "<tr class=".$class.">"; 

         echo "<td><a href=Edit_Customer.php?c_id=".$new_result[$i]['c_id'].">".$new_result[$i]['c_id']."</a></td>"; 
         echo "<td><a href=Edit_Customer.php?c_id=".$new_result[$i]['c_id'].">".$new_result[$i]['c_name']."</a></td>"; 
         echo "<td><a href=Edit_Customer.php?c_id=".$new_result[$i]['c_id'].">".$new_result[$i]['phone']."</a></td>"; 

        echo "</tr>";      

       } 

      ?>  

     </table>