Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

allex_carvalho

Reordenar itens para exibição

Recommended Posts

Boa tarde,

 

Estou desenvolvendo um sistema de busca onde terão anúncios pagos (terá período inicial e final cadastrado) e anúncios grátis. Os pagos terão destaques. Tenho duas tabelas, empresas e publicidades. Na tabela publicidades, gravo o id da empresa junto com os dados da publicidade.

 

Estou exibindo os itens certinho, onde tem publicidade dou todo destaque necessário, só que não estou conseguindo reordenar a exibição. Como faço para colocar as empresas com anúncio no topo da pesquisa?

$query_inicial = "SELECT `empresas`.`id`, `empresas`.`fantasia`, `empresas`.`endereco`, `empresas`.`complemento`, `empresas`.`bairro`, `empresas`.`cep`, `cidades`.`uf`, `cidades`.`nome`, `empresas`.`telefone_1`, `empresas`.`telefone_2`, `empresas`.`telefone_3`, `empresas`.`site`, `empresas`.`facebook` FROM `empresas` INNER JOIN `cidades` ON `empresas`.`cidade` = `cidades`.`id`";
$query = $query_inicial . $condicao . $titulo . $ramo . $estado . $cidade;
$sql = $query . " ORDER BY `empresas`.`fantasia` LIMIT " . $inicio . "," . $quantidade;
$qr = mysqli_query($conn, $sql) or die(mysqli_error($conn));

echo '<ul id="lista_resultado">';
if (mysqli_num_rows($qr) > 0) {
    $id_item = '';
    $id = '';
    $ids = '';
    $fantasia = '';
    $endereco = '';
    $complemento = '';
    $bairro = '';
    $cep = '';
    $cidade_uf = '';
    $telefone_1 = '';
    $telefone_2 = '';
    $telefone_3 = '';
    $site = '';
    $facebook = '';

    while ($rs = mysqli_fetch_assoc($qr)) {
        $id_item .= $rs['id'] . ',';
        $id[$rs['id']] = array(
            $ids = $rs['id'] . ',',
            $fantasia = $rs['fantasia'],
            $endereco = $rs['endereco'],
            $complemento = (!empty($rs['complemento'])) ? ', ' . $rs['complemento'] : '',
            $bairro = $rs['bairro'],
            $cidade_uf = $rs['nome'] . ' - ' . $rs['uf'],
            $cep = $rs['cep'],
            $telefone_1 = $rs['telefone_1'],
            $telefone_2 = (!empty($rs['telefone_2'])) ? ' / ' . $rs['telefone_2'] : '',
            $telefone_3 = (!empty($rs['telefone_3'])) ? ' / ' . $rs['telefone_3'] : '',
            $site = $rs['site'],
            $facebook = $rs['facebook']
        );
    }
    
    $sql_anuncio = "SELECT `id_empresa`, `imagem_pesquisa` FROM `publicidades` WHERE `id_empresa` IN (" . trim($id_item, ',') . ") AND `data_inicial` >= CURDATE() AND CURDATE() <=`data_final`";
    $qr_anuncio = mysqli_query($conn, $sql_anuncio) or die(mysqli_error($conn));
    
    $id_publicidade = [];
    $id_empresa = '';
    $imagem = '';

    while ($rs_anuncio = mysqli_fetch_assoc($qr_anuncio)) {
        $id_publicidade[$rs_anuncio['id_empresa']] = array(
            $id_empresa = $rs_anuncio['id_empresa'],
            $imagem = $rs_anuncio['imagem_pesquisa']
        );
    }
    
    foreach ( $id as $array => $dados ) {
        
        $classe = '';
        foreach ( $id_publicidade as $array_publicidade => $dados_publicidade ) {
            $classe = ( trim($dados[0], ',') === $dados_publicidade[0] ) ? 'class="anuncio"' : 'class="convencional"' ;
            $imagem = ( trim($dados[0], ',') === $dados_publicidade[0] ) ? '<img class="logo" src="' . URL . 'uploads/' . $dados_publicidade[1] . '" alt="' . $dados[1] . '" />' : '' ;
        }
        
        $cep = $dados[6];
        $p1 = substr($cep, 0, 2);
        $p2 = substr($cep, 2, 3);
        $p3 = substr($cep, 5, 3);
        $cep = $p1 . '.' . $p2 . '-' . $p3;
        
        echo '
            <li ' . $classe . '>
                ' . $imagem . '
                <h2>' . $dados[1] . '</h2>
                <p>' . $dados[2] . $dados[3] . ', ' . $dados[4] . ', ' . $dados[5] . '. CEP ' . $cep . '</p>
                <p class="url">
                    <img src="' . URL . 'img/telefone.png" alt="Site da ' . $dados[1] . '" />
                    ' . $dados[7] . $dados[8] . $dados[8] . '
                </p>';
        if (!empty($dados[10])) {
            echo '
                        <p class="url">
                            <img src="' . URL . 'img/site.png" alt="Site da ' . $dados[1] . '" />
                            <a href="' . $dados[10] . '" target="_blank" title="' . $dados[1] . '">' . $dados[10] . '</a>
                        </p>
                    ';
        }
        if (!empty($dados[11])) {
            echo '
                        <p class="url">
                            <img src="' . URL . 'img/facebook.png" alt="Page da ' . $dados[1] . '" />
                            <a href="https://www.facebook.com/' . $dados[11] . '" target="_blank" title="' . $dados[11] . '">https://www.facebook.com/' . $dados[11] . '</a>
                        </p>
                    ';
        }
        echo '
            </li>
        ' . PHP_EOL;
    }
} else {
    echo '<li class="erro">Nenhum registro encontrado...</li>';
}
echo '</ul>';

Obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ordena pelo primeiro select



ORDER BY `empresas`.`fantasia`, `empresas`.`plano` DESC LIMIT

Desta forma vai ter que ter um novo campo



ou



Colocar tudo em única QUERY e chamar em LEFT JOIN a tabela publicidade, mostrando os anúncios caso exista, e mesmo assim vai ter que ordenar com ORDER BY os planos e montar os filtros.


Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite,

 

 

Mas como ficaria a query com o left join? Digo pela condição para validar os períodos:

SELECT * FROM empresas LEFT JOIN publicidades ON empresas.id = publicidades.id_empresa WHERE `data_inicial` >= CURDATE() AND CURDATE() <=`data_final`

Lembrando que meu banco está assim:

 

empresas

id
fantasia
segmento
endereco
complemento
bairro
cep
estado
cidade
telefone_1
telefone_2
telefone_3
site
facebook
status

 

publicidades

id
id_empresa
data_inicial
data_final
imagem_home
imagem_colunas
imagem_pesquisa
imagem

 

Obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acredito que vai ter que usar CASE, mas não sei ao certo, vou te mover para mysql, lá o pessoal pode te ajudar melhor, pois sua dúvida passou a ser mais para SQL do que PHP.

 

;))

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual a diferença do anuncio pago para o não pago em termos de Banco de Dados ?!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na tabela empresas nenhuma. Na tabela publicidade gravo somente anúncios pagos. Gravo o ID da empresa e também o período que a publicidade vai ficar ativa (campos 'data_inicial' e 'data_final').

Compartilhar este post


Link para o post
Compartilhar em outros sites

No order tente algo asssim

 

 

ORDER BY (CASE WHEN PUBLICIDADE.DATA_INICIAL IS NULL THEN 0 ELSE 1 END), ...

 

 

Ordenará quem tem "data" antes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Motta,

 

O primeiro problema, é que usando o LEFT_JOIN não mostra quem não está cadastrado na tabela publicidades. Preciso que mostre todos os resultados, mesmo os que não estão vinculados a tabela publicidades, mas que ordene primeiro quem está nesta tabela.

 

Minha query ficou assim:

SELECT * FROM empresas LEFT JOIN publicidades ON empresas.id = publicidades.id_empresa
WHERE `data_inicial` >= CURDATE() AND CURDATE() <=`data_final`
ORDER BY (CASE WHEN `publicidades`.`data_inicial` IS NULL THEN 0 ELSE 1 END)

Obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

você tem que inverter a ordem do seu select.

 

Você tem que fazer o select nas publicidades e achar as empresas relacionadas e não fazer join nas empresas para achar as publicidades equivalentes.

SELECT * FROM publicidades LEFT JOIN empresas  ON empresas.id = publicidades.id_empresa
WHERE `data_inicial` >= CURDATE() AND CURDATE() <=`data_final`
ORDER BY (CASE WHEN `publicidades`.`data_inicial` IS NULL THEN 0 ELSE 1 END)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia pessoal,

 

Fiz umas alterações no código. A condição das datas estou fazendo pelo php, na query estou usando o left_join, ficou funcionando perfeitamente. Vejam como ficou:

$query_1 = "SELECT `publicidades`.`data_inicial`, `publicidades`.`data_final`, `publicidades`.`imagem_pesquisa`, empresas.*, `cidades`.`nome`, `cidades`.`uf`";
$query_2 = $query_1 . " FROM `empresas` INNER JOIN `cidades` ON `empresas`.`cidade` = `cidades`.`id` LEFT JOIN `publicidades` ON `empresas`.`id` = `publicidades`.`id_empresa`";
$query = $query_2 . $condicao . $titulo . $ramo . $estado . $cidade;
$sql = $query . " ORDER BY `publicidades`.`data_inicial` DESC,`empresas`.`fantasia` LIMIT " . $inicio . "," . $quantidade;
$qr = mysqli_query($conn, $sql) or die(mysqli_error($conn));

echo '<ul id="lista_resultado">';
if (mysqli_num_rows($qr) > 0) {
    while ($rs = mysqli_fetch_assoc($qr)) {
        $classe = ( date("Y-m-d") >= $rs['data_inicial'] && $rs['data_final'] <= date("Y-m-d") ) ? 'class="convencional"' : 'class="anuncio"';
        $imagem = ( date("Y-m-d") >= $rs['data_inicial'] && $rs['data_final'] <= date("Y-m-d") ) ? '' : '<img class="logo" src="' . URL . 'uploads/' . $rs['imagem_pesquisa'] . '" alt="' . $rs['fantasia'] . '" />';
        $complemento = ( !empty($rs['complemento']) ) ? ', ' . $rs['complemento'] : '';
        $telefone_2 = ( !empty($rs['telefone_2']) ) ? ' / ' . $rs['telefone_2'] : '';
        $telefone_3 = ( !empty($rs['telefone_3']) ) ? ' / ' . $rs['telefone_3'] : '';
        $cep = $rs['cep'];
        $p1 = substr($cep, 0, 2);
        $p2 = substr($cep, 2, 3);
        $p3 = substr($cep, 5, 3);
        $cep = $p1 . '.' . $p2 . '-' . $p3;

        echo '
            <li ' . $classe . '>
                ' . $imagem . '
                <h2>' . $rs['fantasia'] . '</h2>
                <p>' . $rs['endereco'] . $complemento . ', ' . $rs['bairro'] . ', ' . $rs['nome'] . ' - ' . $rs['uf'] . '. CEP ' . $cep . '</p>
                <p class="url">
                    <img src="' . URL . 'img/telefone.png" alt="Telefone da ' . $rs['fantasia'] . '" />
                    ' . $rs['telefone_1'] . $telefone_2 . $telefone_3 . '
                </p>';
        if (!empty($rs['site'])) {
            echo '
                        <p class="url">
                            <img src="' . URL . 'img/site.png" alt="Site da ' . $rs['fantasia'] . '" />
                            <a href="' . $rs['site'] . '" target="_blank" title="' . $rs['fantasia'] . '">' . $rs['site'] . '</a>
                        </p>
                    ';
        }
        if (!empty($rs['facebook'])) {
            echo '
                        <p class="url">
                            <img src="' . URL . 'img/facebook.png" alt="Page da ' . $rs['fantasia'] . '" />
                            <a href="https://www.facebook.com/' . $rs['facebook'] . '" target="_blank" title="' . $rs['facebook'] . '">https://www.facebook.com/' . $rs['facebook'] . '</a>
                        </p>
                    ';
        }
        echo '
            </li>
        ' . PHP_EOL;
    }
} else {
    echo '<li class="erro">Nenhum registro encontrado...</li>';
}
echo '</ul>';

Obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.