Мой запрос должен допускать повторные значения в определенных столбцах, но я хочу, чтобы он возвращал значение null в запрос при повторном значении.
Следующие два изображения показывают мою проблему:
Что теперь возвращается
Что я хочу, чтобы он вернулся:
SQL-запрос:
SELECT * FROM completo_sem_saldo AS a LEFT JOIN posicao_contabil AS b ON (a.Cliente = b.Cliente_Posicao) LEFT JOIN saldo_analitico AS c ON (a.Cliente = c.Cliente_Saldo_Analitico) LEFT JOIN titulos_em_ser AS d ON (a.Cliente = d.Cliente_Titulos_Em_Ser)
Вы можете сделать это на PHP с помощью функции, которая выполняет проверку повторения и возвращает «», когда это повторение:
function blankIfRepeat($result, $key, &$map) { if (isset($map[$key]) && $map[$key] == $result[$key]) { return ""; // it is the same value we encountered last time } $map[$key] = $result[$key]; return $result[$key]; }
Обратите внимание на параметр &
перед последним параметром, чтобы убедиться, что вызывающий абонент получает изменения, внесенные в этот аргумент.
Вы используете его следующим образом:
$map = array(); // initialise the variable used to track repetitions while($resul1 = mysqli_fetch_assoc($query1)) { $nome = $resul1['Nome']; // call the function for the fields that need blanks for repeated values: $sld_dev_ctbl = blankIfRepeat($resul1, 'Sld_dev_ctbl', $map); $saldo = blankIfRepeat($resul1, 'Saldo', $map); $vlr_atual = $resul1['Vlr_atual']; $tabela .= '<tr>'; $tabela .= '<td>'.$nome.'</td>'; $tabela .= '<td>'.$sld_dev_ctbl.'</td>'; $tabela .= '<td>'.$saldo.'</td>'; $tabela .= '<td>'.$vlr_atual.'</td>'; $tabela .= '</tr>'; } $tabela .= '</table>';
ИСПОЛЬЗУЙТЕ переменные, чтобы отображать только первую строку.
Значение по умолчанию для CASE
равно null, поэтому я не включил ELSE
Это предполагает, что нет отрицательного сальдо, поэтому начальное значение равно -1
SELECT CASE WHEN rn = 1 THEN Sld_dev_ctbl END as Sld_dev_ctbl, CASE WHEN rn = 1 THEN Saldo END as Saldo Vlr_actual, FROM ( SELECT *, (@rownum := if( @saldo = Saldo, @rownum + 1, -- increase the counter if (@saldo := Saldo, 0, -- reset the counter for next block 0 ) ) ) as rn FROM completo_sem_saldo AS a LEFT JOIN posicao_contabil AS b ON (a.Cliente = b.Cliente_Posicao) LEFT JOIN saldo_analitico AS c ON (a.Cliente = c.Cliente_Saldo_Analitico) LEFT JOIN titulos_em_ser AS d ON (a.Cliente = d.Cliente_Titulos_Em_Ser) CROSS JOIN (select @rownum := 0, @saldo := -1) params ORDER BY --<provide some field to choose which one will be first> ) T