[英]Sorting a MySQL query with ORDER BY or with PHP sort functions
我有一個查詢,我想按字母順序排序,但是訣竅是我希望排序能平等地對待兩列。 舉例來說,如果第一行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>
如果您的表格非常相似,可以執行此操作
就我而言,我有一個表test_a
其中包含2列id
和name
(SELECT * FROM test_a a1)
UNION ALL
(SELECT * FROM test_a a2)
ORDER BY name DESC
您的問題尚不完全清楚,但是您可以嘗試將其用作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
嘗試
ORDER BY CONCAT(b_name, l_name)
或(如果在EMPTY時您的字段為NULL)
ORDER BY COALESCE(b_name, l_name)
就像他們上面說的,UNION ALL是您的朋友,當然,如果您只有一張桌子,那么您始終可以這樣做:
(SELECT field1 AS name FROM TABLE1)
UNION ALL
(SELECT field2 AS name FROM TABLE1)
ORDER BY name DESC
因此,您要在同一張表中要求兩個不同的行,並按原樣對其進行排序。
感謝您的所有幫助,但是您的回答都沒有讓我對數據進行排序,並且在排序后將其正確地回顯到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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.