Сортировка запроса MySQL с помощью ORDER BY или с помощью функций сортировки PHP - PullRequest
2 голосов
/ 30 июня 2010

У меня есть запрос, который я хочу отсортировать по алфавиту, но хитрость в том, что я хочу, чтобы сортировка обрабатывала два столбца одинаково.Например, если первая строка first_col равна apple, а вторая строка second_col равна aardvark, я хочу, чтобы значение во второй строке second_col было указано перед ,значение в первом ряду first_col.Значение (не NULL или '') всегда будет существовать в каждой строке second_col, но значение в first_col может быть ''.Надеюсь, я объяснил это достаточно хорошо.Мне все равно, нужно ли мне использовать MySQL или PHP для этого, но после сортировки массив читается и выводится в таблицу HTML.Какие-нибудь мысли?

РЕДАКТИРОВАТЬ

Это то, что у меня сейчас есть для кода.В моем запросе MySQL мне нужно, чтобы b_name и l_name были равны.Столбец b_name не всегда имеет значение.Когда я помещаю значения в таблицу, это основывается на существовании b_name.Если b_name не существует, f_name и l_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>

Ответы [ 5 ]

3 голосов
/ 30 июня 2010

Если ваши таблицы очень похожи, вы можете сделать это

В моем случае у меня есть таблица test_a с 2 столбцами id и name

(SELECT * FROM test_a a1) 
UNION ALL 
(SELECT * FROM test_a a2) 
ORDER BY name DESC
1 голос
/ 30 июня 2010

Попробуйте

ORDER BY CONCAT(b_name, l_name)

или (если ваши поля имеют значение NULL, когда ПУСТО)

ORDER BY COALESCE(b_name, l_name)
1 голос
/ 30 июня 2010

Ваш вопрос не совсем понятен, но вы можете попробовать использовать это в качестве предложения 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 голосов
/ 30 июня 2010

Спасибо за вашу помощь, ребята, но ни один из ваших ответов не позволил мне отсортировать данные И правильно отобразить их в таблицу 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>
0 голосов
/ 30 июня 2010

Как говорится выше, UNION ALL - ваш друг, и, конечно, если у вас есть только один стол, вы всегда можете сделать это:

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

Итак, вы запрашиваете две разные строки в одной и той же таблице и упорядочиваете ее как одну.

...