Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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/'](https://www.facebook.com/) . $dados[11] . '" target="_blank" title="' . $dados[11] . '">[https://www.facebook.com/'](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.
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.
Vai ter que trabalhar com alias, para a query saber de qual tabela é os campos.
Quanto a isso está ok, digo porque quando coloco a condição só busca quem é anunciante, os cadastros grátis não aparecem na busca.
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.
;))
Qual a diferença do anuncio pago para o não pago em termos de Banco de Dados ?!
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').
No order tente algo asssim
ORDER BY (CASE WHEN PUBLICIDADE.DATA_INICIAL IS NULL THEN 0 ELSE 1 END), ...
Ordenará quem tem "data" antes.
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.
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)Também não funcionou Vinicius, continua não encontrando resultados.
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/'](https://www.facebook.com/) . $rs['facebook'] . '" target="_blank" title="' . $rs['facebook'] . '">[https://www.facebook.com/'](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.
Ordena pelo primeiro select
ORDER BY
empresas.fantasia,empresas.planoDESC LIMITDesta 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.