За последние 24 часа нас посетили 63315 программистов и 1740 роботов. Сейчас ищут 872 программиста ...

Проблемы с вложенным циклом

Тема в разделе "PHP для новичков", создана пользователем kilroy, 8 май 2008.

  1. kilroy

    kilroy Активный пользователь

    С нами с:
    25 фев 2008
    Сообщения:
    46
    Симпатии:
    0
    Адрес:
    у тебя пельмени?
    Предположения что проблемы с вложенным циклом, хотя может и в запросе тоже беда.
    Вообщем - надо вывести теги прикрепленные к новостям.
    В БД 2 таблицы- теги(tags) и новости(notes). Теги привязываються к новосте с помощью ИД новости, значение которой находится в талице теги.

    Запрос к бд на вывод новостей
    [sql]
    $query_notes = "SELECT categories.name, notes.id, notes.time, notes.added, notes.title, notes.content, notes.importance FROM notes, categories WHERE notes.catid = categories.id ORDER BY id DESC";
    [/sql]

    ну вот сам цикл

    PHP:
    1.  
    2. <?php do { ?>
    3.  <?php
    4. $noteid = $row_notes['id'];
    5. mysql_select_db($database_blog, $blog);
    6. $query_tags = sprintf("SELECT tag, noteid FROM tags WHERE noteid = %s", $noteid);
    7. $tags = mysql_query($query_tags, $blog) or die(mysql_error());
    8. $row_tags = mysql_fetch_assoc($tags);
    9. $totalRows_tags = mysql_num_rows($tags);
    10.  
    11. echo $row_notes['title'];
    12.  
    13. echo $row_tags['tag'];
    14. ?>
    15.  
    16. <?php } while ($row_notes = mysql_fetch_assoc($notes)); ?>
    17.  
    Кстати, то что я вложил запрос в цикл наверное плохо, но что то альтернативного варианта не придумал пока что...

    Собсно сейчас там один цыкл, выводится-повторяется каждая новость столько раз сколько у нее тегов.
    Как бы вот вывести в одном цикле отдельно новости или теги я могу, а вот что бы цикл в цикле , с этим проблема.
    Я так понимаю нада сделать так что бы первый цикл выводил новости, а цикл который в нем выводил к каждой новосте теги...эээ...пральна?
     
  2. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    kilroy
    Может стоит выбрать все теги одним запросом, сформировать из них какой-нибудь удобный для дальнейшего пользования массив, и тогда уже пробежаться по новостям?
    Если тегов много, можно выбрать только те, которые имеют отношение только к заданным новостям. В запросе это выглядит примерно как SELECT * FROM tags WHERE noteid IN (<список ID новостей через запятую>)
     
  3. kilroy

    kilroy Активный пользователь

    С нами с:
    25 фев 2008
    Сообщения:
    46
    Симпатии:
    0
    Адрес:
    у тебя пельмени?
    Dagdamor
    Не въехал.
    У меня вот тут выбираються теги которые имеют отношение только к определенной новосте
    [sql]"SELECT tag, noteid FROM tags WHERE noteid = %s", $noteid[/sql]

    Как бы, я думаю правельным будет сделать вложенный цикл который бы выводил теги.
     
  4. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    kilroy
    Просто если новостей на странице много, твой запрос придется выполнять много раз, для каждой новости отдельно. Я же предлагаю сделать один запрос, а потом уже группировать полученные данные.
     
  5. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Как вариант, сделать селект постов, потом пройти циклом и собрать все id постов. Затем сделать селект из меток in (id постов). Два запроса. Один простой цикл + один цикл с echo полей.

    P.S. Для упрощения первого цикла можно дублировать первый селект постов, но только с одним полем. Хотя, это лишнее. Цикл будет в разы быстрее, чем лишний запрос, имхо.
     
  6. EugeneTM

    EugeneTM Активный пользователь

    С нами с:
    19 апр 2008
    Сообщения:
    85
    Симпатии:
    0
    "SELECT DISTINCT categories.name, notes.id, notes.time, notes.added, notes.title, notes.content, notes.importance, tags.tag FROM notes, categories, tags WHERE notes.catid = categories.id AND tags.noteid = notes.id ORDER BY notes.id DESC";

    когда в цикле фетчишь - проверяешь новость та же что и в предыдущей записи, если да только тег, если нет - новость и тег принтишь.
    Про дистинкт не уверен что нужен. Но сдается при этом запросе кучу дублей получишь.
     
  7. kilroy

    kilroy Активный пользователь

    С нами с:
    25 фев 2008
    Сообщения:
    46
    Симпатии:
    0
    Адрес:
    у тебя пельмени?
    Всем спасибо))
    Ээээ, решил с помощью вложенного цикла...
    Только вот непонил почему сейчас заработало как нада, раньше вроде так же писал, но не работало как нада))