使用ORDER BY或PHP排序函数对MySQL查询进行排序

时间:2010-06-29 22:03:36

标签: php mysql sorting sql-order-by

我有一个查询,我想按字母顺序排序,但诀窍是我希望排序平等对待两列。例如,如果first_col的第一行等于applesecond_col的第二行等于aardvark,我希望second_col的第二行中的值为first_col列出之前 NULL第一行中的值。值{(''second_col)将始终存在于first_col的每一行中,但''中的值可以为b_name。希望我已经解释得这么好了。我不在乎是否必须使用MySQL或PHP,但是一旦排序,数组就会被读取并回显到HTML表中。有什么想法吗?

修改

这就是我现在所拥有的代码。在我的MySQL查询中,我需要l_nameb_name相等。列b_name并不总是有值。当我将值放入表中时,它基于b_name的存在。如果f_name不存在,则会l_nameb_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>

{{1}}

5 个答案:

答案 0 :(得分:3)

如果您的表非常相似,则可以执行此操作

在我的情况下,我有一个表test_a,其中包含2列idname

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

答案 1 :(得分: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

答案 2 :(得分:1)

尝试

ORDER BY CONCAT(b_name, l_name)

或(如果您的字段在EMPTY时为NULL)

ORDER BY COALESCE(b_name, l_name)

答案 3 :(得分:0)

如上所述,UNION ALL是你的朋友,当然,如果你只有一张桌子,你可以随时这样做:

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

所以,你要求同一个表中有两个不同的行,并按顺序排序。

答案 4 :(得分:0)

感谢所有帮助人员,但是没有一个答案允许我对数据进行排序并在排序后将其正确地回显到HTML表中。 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>