Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá,
Quero relacionar todos os títulos das notícias pelo ano. Ex.:
2009
Notícia 1
Notícia 2
Notícia 3
...
..
2008
Notícia 1
Notícia 2
Notícia 3
...
..
2007
Notícia 1
Notícia 2
Notícia 3
...
..
Devo fazer duas query?
Obs.: "Visualmente" o group_concat do Mysql funciona, mas não dá certo, pois quando eu agrupo todos os títulos, não consigo obter a id de cada título.
Olá Beraldo,
Bom, estou tentando fazer o que você recomenda.
Me dê uma luz, se possível, de como fazer com que as datas não se repitam.
$Qry = mysql_query("
SELECT
id, titulo, DATE_FORMAT(data, '%Y') AS data
FROM noticias
WHERE categoria = '".SITE_COD."'
ORDER BY YEAR(data)DESC");Elas vão se repetir, caso contrário, só aparecerá uma notícia para cada ano. O que você tem que fazer é agrupar, no HP, as notícias com os mesmos anos.
Olá,
Já fiz um while pra pegar os anos, os coloquei em um vetor, removi os valores iguais.
Fiz um outro laço pra pegar os valores da tabela, mas não estou conseguindo fazer o que preciso.
O que você quer não é remover valores iguais, pel que entendi
Faça assim:
1. Selecione todos os registros ordenando por ano
2. Selecione os totais de notícias de cada ano. Pode fazer assim:
SELECT ano, COUNT(ano) as total_ano FROM tabela GROUP BY ano;
Isso traz o ano e quantas notícias há nele.
3. Tendo as notícias ordenadas em um array e os totais de notícias por ano, você pode manipular o array com base nos dados do passo 2. por exemplo, da posíção 0 a 120, notícias de 2008. De 121 a 300, de 2009 etc
Consegui fazer isso.
$Qry = mysql_query("SELECT id, titulo, DATE_FORMAT(data, '%Y') AS data FROM noticias WHERE categoria = '".SITE_COD."' ORDER BY YEAR(data)DESC");
while($x = mysql_fetch_array($Qry))
{
$ano[] = $x['data'];
}
$ano = array_unique($ano);
$total = count($ano);
mysql_data_seek($Qry,0);
for($i = 0; $i < $total; $i++)echo "<br /><h6>".current($ano)."</h6><br />";
while($x = mysql_fetch_array($Qry))
{
if($x['data'] == current($ano))
{
echo "<a href='{$URLPadrao}{$URIDir}/noticia/$x[id]/".limpaUrl($x['titulo'])."/'>$x[titulo]</a><br />";
}
}
next($ano);
}
Ele lista os anos corretamente, pegando as notícias do primeiro ano, mas os outros anos do laço ficam sem notícias.
O que está faltando?
>
Consegui fazer isso.
$Qry = mysql_query("SELECT id, titulo, DATE_FORMAT(data, '%Y') AS data FROM noticias WHERE categoria = '".SITE_COD."' ORDER BY YEAR(data)DESC");
while($x = mysql_fetch_array($Qry))
{
$ano[] = $x['data'];
}
$ano = array_unique($ano);
$total = count($ano);
mysql_data_seek($Qry,0);
for($i = 0; $i < $total; $i++)echo "<br /><h6>".current($ano)."</h6><br />";
while($x = mysql_fetch_array($Qry))
{
if($x['data'] == current($ano))
{
echo "<a href='{$URLPadrao}{$URIDir}/noticia/$x[id]/".limpaUrl($x['titulo'])."/'>$x[titulo]</a><br />";
}
}
next($ano);
}
Ele lista os anos corretamente, pegando as notícias do primeiro ano, mas os outros anos do laço ficam sem notícias.
O que está faltando?
Aparentemente deu certo agora.
Criei uma condição else dando um break no laço.
Se vocês tiverem uma solução melhor, por favor me avisem.
[RESOLVIDO]
eu fiz algo parecido com sua duvida a um tempo atras não sei mas talvez pode dar uma luz pra voce ou pra quem tem uma duvida parecida http://forum.imasters.com.br/public/style_emoticons/default/natal_happy.gif
$sql = "SELECT DISTINCT month (data) AS 'month', year(data) AS 'year' FROM noticias INNER JOIN fusao ON noticias.idnoticia=fusao.idnoticia AND noticias.idnoticia ORDER BY noticias.data DESC";
$sql_consulta = mysql_query($sql);
$anoAtual = '';
while($l = mysql_fetch_assoc($sql_consulta)){
$data = $l["month"];
$ano = $l["year"];
$mes = date("F", mktime(0, 0, 0, $l['month']));
switch($mes){
case "January" : $mes = "Janeiro";
break;
case "February" : $mes = "Fevereiro";
break;
case "March" : $mes = "Março";
break;
case "April" : $mes = "Abril";
break;
case "May" : $mes = "Maio";
break;
case "June" : $mes = "Junho";
break;
case "July" : $mes = "Julho";
break;
case "August" : $mes = "Agosto";
break;
case "September" : $mes = "Setembro";
break;
case "October" : $mes = "Outubro";
break;
case "November" : $mes = "Novembro";
break;
case "December" : $mes = "Dezembro";
break;
}
if($anoAtual != $l['year'])echo '<div id="campoindice">';
echo'
<div id="tituloindice"><strong>
' . $l['year'] . '
</strong>
</div>
';
$anoAtual = $l['year'];
}
echo'<div id="campoindicemes">';
echo '
<p align="right">
<strong></strong>
</p>
';
echo'</div>
</div>';
}
Assim lista desta maneira.
2010
Janeiro
2009
Dezembro
Novembro
Outubro
Olá,
Notei que a solução eu havia apresentado estava com um pequeno bug no final do laço de repetição.
Portanto posto aqui a solução definitiva para o problema por mim levantado. Caso alguém precise.
$Qry = mysql_query("SELECT id, titulo, DATE_FORMAT(data, '%Y') AS data FROM noticias WHERE categoria = '".SITE_COD."' ORDER BY YEAR(data)DESC, titulo ASC");
while($x = mysql_fetch_array($Qry))
{
$valor[$x['data']][] = "<a href='{$URLPadrao}{$URIDir}/noticia/$x[id]/".limpaUrl($x['titulo'])."/'>$x[titulo]</a><br />";
}
foreach($valor as $conteudo=>$ano)echo "<br /><h6>$conteudo</h6>";
foreach($ano as $link) echo $link;
}
}
Apenas faça uma consulta ordenando pelo ano. Depois você separa cada notícia usando o PHP mesmo. Você pode percorrer o resultado e gerar arrays para cada ano ou pode fazer outra consulta para saber a quantidade de notícias de cada ano, para separar o array diretamente, sem percorrer índice por índice