[英]PHP Change MySQL Order By If Condition Met
我試圖改變MySQL結果的順序取決於PHP
是否滿足if
條件。
我的代碼檢查是否有任何行是duplicates
,如果是, duplicates
改行類。
我想要實現的是,如果有重復,則MySQL查詢按Frequency
排序,如果沒有找到重復項,則按Name
排序。
這就是我所擁有的:
function getFrequencies() {
$conn = getConnected("websiteData");
$frequencyQuery = "
SELECT
f.Name,
f.Frequency,
f.Country,
f.Programmed,
(SELECT count(*) FROM frequencies WHERE Frequency = f.Frequency) as count
FROM frequencies f;
";
$frequencyResult = mysqli_query($conn, $frequencyQuery);
while ($frequencyRow = mysqli_fetch_assoc($frequencyResult)) {
if($frequencyRow['count'] > 1) {
$frequencyQuery = "
SELECT
f.Name,
f.Frequency,
f.Country,
f.Programmed,
(SELECT count(*) FROM frequencies WHERE Frequency = f.Frequency) as count
FROM frequencies f
ORDER BY Frequency;
";
} else {
$frequencyQuery = "
SELECT
Name,
Frequency,
Country,
Programmed
FROM frequencies
ORDER BY Name;
";
}
}
$frequencyResult = mysqli_query($conn, $frequencyQuery);
while ($frequencyRow = mysqli_fetch_assoc($frequencyResult)){
if ($frequencyRow['count'] > 1) {
echo '<tr class="warning">' .
"<td>" . $frequencyRow['Name'] . "</td>" .
"<td>" . $frequencyRow['Frequency'] . "</td>" .
"<td>" . $frequencyRow['Country'] . "</td>" .
"<td>" . $frequencyRow['Programmed'] . "</td>" .
"</tr>" . PHP_EOL;
} else {
echo "<tr>" . PHP_EOL .
"<td>" . $frequencyRow['Name'] . "</td>" .
"<td>" . $frequencyRow['Frequency'] . "</td>" .
"<td>" . $frequencyRow['Country'] . "</td>" .
"<td>" . $frequencyRow['Programmed'] . "</td>" .
"</tr>" . PHP_EOL;
}
}
}
現在我知道我的表包含重復項,但目前沒有任何突出顯示的行,順序是按Name
。
在我將代碼更改為上面提到的代碼之前,這個代碼突出了我的重復行:
function getFrequencies() {
$conn = getConnected("websiteData");
// $frequencyQuery = "SELECT Name, Frequency, Country, Programmed, count(*) FROM frequencies GROUP BY Frequency ORDER BY Name";
$frequencyQuery = "
SELECT
f.Name,
f.Frequency,
f.Country,
f.Programmed,
( SELECT count(*) FROM frequencies WHERE Frequency = f.Frequency ) as count
FROM frequencies f
ORDER BY Frequency;
";
$frequencyResult = mysqli_query($conn, $frequencyQuery);
while ($frequencyRow = mysqli_fetch_assoc($frequencyResult)) {
if ($frequencyRow['count'] > 1) {
echo '<tr class="danger">' . PHP_EOL .
"<td>" . $frequencyRow['Name'] . "</td>" . PHP_EOL .
"<td>" . $frequencyRow['Frequency'] . "</td>" . PHP_EOL .
"<td>" . $frequencyRow['Country'] . "</td>" . PHP_EOL .
"<td>" . $frequencyRow['Programmed'] . "</td>" . PHP_EOL .
"</tr>" . PHP_EOL;
} else {
echo "<tr>" . PHP_EOL .
"<td>" . $frequencyRow['Name'] . "</td>" . PHP_EOL .
"<td>" . $frequencyRow['Frequency'] . "</td>" . PHP_EOL .
"<td>" . $frequencyRow['Country'] . "</td>" . PHP_EOL .
"<td>" . $frequencyRow['Programmed'] . "</td>" . PHP_EOL .
"</tr>" . PHP_EOL;
}
}
}
我能做些什么來實現我想做的事情? 我想要更改順序的原因是因為當沒有重復時,優先按字母順序滾動列表,但如果有重復項, Frequency
對其進行排序會將重復項放在另一行之后使其易於find
和edit/delete
。
基於你想要做的事情,我將構建一個結果的關聯數組,然后使用你的邏輯來使用PHP而不是MySQL的order by
子句對它們進行order by
。
你可以采取(如果您想保留的所有副本)的方法是通過比較排序數組建表Name
key
,然后說if unique display
else
for each duplicate in array display
,這將導致所有的副本是的連續顯示,整個事件按字母順序排序,您可以使用asort
。
為了阻止這種情況觸發副作用,你可以構建兩個數組,一個來自MySQL select
,另一個是使用array_unique
獨特的,當你循環遍歷數組以顯示頁面時,你可以循環遍歷唯一的數組並只獲取渲染時原始數組中的重復元素。
考慮以下:
<?php
$array = array();
$uniqueArray = array_unique($array);
for ( $i = 0; $i < sizeof($uniqueArray); ++$i ) {
if ( in_array($uniqueArray[$i], $array) ) {
// Item has duplicates
} else {
// item is unique
}
}
?>
如果您不想保留重復項,則可以完全按照相同的公式進行操作,但在匹配副本而不是顯示它們時,您可以從數據庫中清除它們中的每一個,只保留一個然后從唯一數組中呈現項目。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.