2010-06-29 44 views
1

我有一個查詢,我想按字母順序排序,但訣竅是,我希望排序平等對待兩列。舉例來說,如果first_col第一行等於applesecond_col第二行等於aardvark我想要的second_col第二行中的值first_col第一行上市前值。一個值(不是NULL'')將始終存在於second_col的每一行中,但first_col中的值可以是''。希望我已經解釋了這一點。我不在乎是否必須爲此使用MySQL或PHP,但是一旦排序,數組就會被讀取並回顯到HTML表格中。有什麼想法嗎?使用ORDER BY或PHP排序函數排序MySQL查詢

編輯

這是我的代碼現在。在我的MySQL查詢中,我需要b_namel_name相等。列b_name並不總是有一個值。當我將這些值放入表中時,它基於b_name的存在。如果b_name不存在,則組合f_namel_name以取代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

如果第一行是'「一個」,「b''和第二行是'」 B「」 a''和兩列一視同仁,其中那些行的要來的第一和爲什麼? – 2010-06-29 22:06:14

+0

向我們顯示查詢。通常,使用兩列作爲排序的唯一可靠方法需要使用UNION – 2010-06-29 22:07:36

回答

0

非常感謝您的幫助,但您的答案都不允許我對數據進行排序,並且一旦排序就可以正確地將其回顯到HTML表格中。 A UNION可能已經工作了,但我認爲我的解決方案更快,據此全力以赴。

   $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> 
+1

選擇整個表更快?好吧。我希望你的服務器運氣好。 – 2010-06-30 06:04:31

+0

@Col。夏普內爾,你應該再看看我的答案中的查詢。我不是選擇整個表格,只是選擇我需要的字段。 – ubiquibacon 2010-06-30 07:14:09

+1

大聲笑你很有趣的傢伙:)領域意味着什麼,而行是一切。 – 2010-06-30 10:37:36

1

你的問題不完全清楚,但你可以嘗試使用這個作爲你的ORDER BY子句:

ORDER BY LEAST(first_col, second_col) 

示範:

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

這基本上是我所做的,但它不起作用,因爲'first_col'總是優先,所以'second_col'中的所有內容都以列表的底部。 – ubiquibacon 2010-06-29 22:37:11

+0

@typoknig:根據你的問題,你寫了'ORDER BY first_col,second_col'。這是不一樣的。 – 2010-06-29 22:44:06

+0

結果是一樣的,我都試過了。 – ubiquibacon 2010-06-29 22:45:08

2

如果你的表是非常相似的,你可以做到這一點

在我的情況下,我有一個表test_a與2列idname

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

我認爲這是最好的解決方案。 – mRt 2010-06-30 01:41:50

1

嘗試

ORDER BY CONCAT(b_name, l_name) 

或(空的時候,如果你的字段是NULL)

ORDER BY COALESCE(b_name, l_name) 
0

正如他們上面說,UNION ALL是你的朋友,當然如果你只有一張桌子,你可以這樣做:

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

因此,您要求在同一張表中排列兩個不同的行,並將它排序爲一個。