Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Цикл


Автор: Dimash[Odessa] 26.12.2006, 11:56
Код

    
            $q=mysql_query("SELECT `added` FROM `news`");
                  for(;$r=mysql_fetch_assoc($q);){
                    $added=explode("-",$r['added']);
                    $day=$added[2];
                 $month=$months_r[$added[1]];
                    $year[].=$added[0];
                    }


Как сделать так, чтобы года не повторялись вот так 2004 2004 2005 2005 2005 , а каждый год был по одному.. как написать условие.. что не писал .. одна же ерунда.  Ps. В Базе есть новости, и года высвечиваются в админке, если на этот год есть новость как ссылка... Вот для чего так выводить года.

Добавлено @ 12:04 
\
Код

    
            
            for($i=2100;$i>=2003;$i--)
            {
                
            

            $q=mysql_query("SELECT `added` FROM `news`");
                  for(;$r=mysql_fetch_assoc($q);){
                    $added=explode("-",$r['added']);
                    $day=$added[2];
                 $month=$months_r[$added[1]];
                    $year[].=$added[0];
                        if($i==$added[0])
                        {
                        echo $i;
                        break;    
                        }
                    }
            
                    
            }
                
        

Автор: Nicholas_S 26.12.2006, 12:07
Dimash[Odessa], сразу замечания:
1. По коду - учитесь писать грамотно, посмотрите на примеры профессионалов.
2. ПО условию - формулируй, чтобы отвечающие поняли.
Непонятно, почему года сохраняются в элемент массива, поэтому пример без этого:
Код

$q = mysql_query('SELECT `added` FROM `news`');
$year = 0;
while ($r=mysql_fetch_assoc($q))
{
  $added = explode('-', $r['added']);
  $day = $added[2];
  $month = $months_r[$added[1]];
  if ($added[0] != $year)
  {
    $year = $added[0];
    // здесь действия по выводу года и проч.
  }
}


Added
Когда отвечал, добавления не было.
Более рационально было бы воспользоваться хранением даты в поле типа date и использовать один запрос SQL для извлечения неповторяющихся значений годов.

Автор: -=Ustas=- 26.12.2006, 12:09
странные вообще-то у тебя конструкции. ты лучше скажи что тебе нужно и структуру таблицы покажи

Автор: Dimash[Odessa] 26.12.2006, 12:19
Спасибо Николос. Твоя конструкция намного лучше.

Автор: G0rinich 28.12.2006, 12:01
Если года надо вернуть именно в виде массива, то можно предложить 2 решения

1. Все оставить точно так и над итоговым массивом сделать array_unique()
2. Делать не $year[].=$added[0];, а $year[$added[0]]++; А потом вернуть array_keys().

Кажется мне, что второй вариант оптимальнее.

Ну или использовать пример Nicholas_S, но только если вывод будет осуществляться тут же и при условии, что года идут последовательно и не может быть последовательности типа 2006 2005 2004 2005...

Ну а самое грамотное, это заставить БД выдать все уникальные года, это будет на порядок быстрее, т.к. MySQL с математическими операциями работает пошустрее РНР.

Автор: Mal Hack 28.12.2006, 15:37
Если надо получить список лет, то:
Код
SELECT `added` FROM `news` GROUP BY `added`

или добавлоением в начал DISTICT

Модератор: тема для MySQL форума

Автор: Nicholas_S 28.12.2006, 16:09
Mal Hack, у него даты хранятся в текстовом формате, поэтому получить неповторяющийся список годов таким запросом не получится.
Плюс небольшая поправка - DISTINCT.  smile 

Автор: Mal Hack 28.12.2006, 16:14
Nicholas_S, SUBSTRING на что? FORMAT_DATE на что?

Автор: Nicholas_S 28.12.2006, 18:55
Mal Hack, при условии, что ему нужно вытащить не только часть даты, но так же еще и день/месяц, то DISTINCT не выдаст нужного результата - он исключит все одинаковые даты, однако даты типа 2006-11-12 & 2006-11-13 он не разделит как одинаковые. Даже если ты вызовешь SUBSTRING(<здесь выдираем дату>), то DISTINCT не сработает в виду уникальности полей дат.
Приведешь пример?  smile 

Автор: Mal Hack 28.12.2006, 18:59
Nicholas_S, я не имею ввиду, когда ему надо вытащить все новости. Если ему надо получить года, когда были новости, то надо делать так, как я говорил выше с использованием FORMAT_DATE.

Автор: Nicholas_S 28.12.2006, 19:17
Mal Hack, если только года, то согласен

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)