За последние 24 часа нас посетил 34331 программист и 1315 роботов. Сейчас ищут 1063 программиста ...

Сортировка в запросе и последующие условия

Тема в разделе "Прочие вопросы по PHP", создана пользователем darkgod, 11 дек 2009.

  1. darkgod

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

    С нами с:
    31 мар 2008
    Сообщения:
    201
    Симпатии:
    0
    Доброго всем времени суток!
    столкнулся с такой проблемой при сортировке запроса MySQL:

    Вот сам запрос, который корректно работает и выводит результаты с сортировкой по полю count
    PHP:
    1.  
    2. <?
    3. $sql = $db->query("SELECT * FROM banners WHERE status = '1' ORDER BY count ASC LIMIT 1");
    4. $item = $db->fetchrow($sql);
    5.  
    6. echo $item['id'];
    7. ?>
    8.  
    Далее, ставим условие и если оно выполняется, прибавляем +1 в count
    PHP:
    1.  
    2. <?
    3. if($item['user_group'] == 1) {
    4.  
    5. $db->query("UPDATE banners SET count=count+1 WHERE id='" . intval($item['id']) . "'");
    6.  
    7. echo $item['id'];
    8. }
    9. ?>
    10.  

    Ну а далее сама проблема: Обновили мы все записи попадающие под условие и увеличили значение count на 1.
    Далее запрос направил нас на запись (при помощи сортировки) не попадающее под наше условие, у которой значение поля count меньше на 1 чем у все остальных. Соответственно эта запись не будет обновлена и выводиться больше ничего не будет.

    Каким образом можно решить эту проблему???
     
  2. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Можно поподробнее с этого момента?
    Как направил? :)

    И непрозрачна сама проблема. Можно вкратце сказать - что делается и что именно не работает? :)
     
  3. darkgod

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

    С нами с:
    31 мар 2008
    Сообщения:
    201
    Симпатии:
    0
    в запрос попадают все записи у которых status=1, а лимит=1 выводит нам поочереди по одной записи.

    Далее есть условие, которое из тех записей выдаст только записи у которых user_group=1, и только у этих записей будет обновлено поле count по которому и есть сортировка. Следовательно у записей user_group не равных 1, счетчик не будет обновлен и вывод не продолжится.
     
  4. karakh

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

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    я правильно понял, что ты впихал в цикл select по одной строке и update по одной строке?

    А точно нельзя
    PHP:
    1. <?
    2. $db->query("UPDATE banners SET count=count+1 WHERE [b]status = 1 AND user_group = 1[/b]);
    ?
     
  5. Silicium

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

    С нами с:
    1 апр 2008
    Сообщения:
    205
    Симпатии:
    0
    Адрес:
    Киев
    karakh
    Тсс... сИкреты выдаешь :)
     
  6. darkgod

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

    С нами с:
    31 мар 2008
    Сообщения:
    201
    Симпатии:
    0
    karakh
    Silicium
    Вы прежде чем писать пробовали правильно прочитать о чем я написал????

    покажу пример на пальцах:


    есть таблица с полями

    id | status | user_group | count
    1 1 1 1
    2 1 1 1
    3 1 2 1


    Есть запрос
    PHP:
    1. <?
    2.  $sql = $db->query("SELECT * FROM banners WHERE status = '1' ORDER BY count ASC LIMIT 1");
    3.  $item = $db->fetchrow($sql);
    4.  
    5.  echo $item['id'];
    6.  ?>

    Который будет доставать по одной записи и сортировать по полю count. А также есть условие и запрос, который будет увеличивать поочередно (если выполняется условие) при выводе новой записи count на 1


    PHP:
    1. <?
    2.  if($item['user_group'] == 1) {
    3.  
    4.  $db->query("UPDATE banners SET count=count+1 WHERE id='" . intval($item['id']) . "'");
    5.  
    6.  echo $item['id'];
    7.  }
    8.  ?>

    Т.е. если мы уже показали 2 записи попадающих под все уловия, то получим в базе следующее:

    id | status | user_group | count
    1 1 1 2
    2 1 1 2
    3 1 2 1


    А 3 запись выводиться не будет, т.к. под условия в select она попадает, но не попадает под условие if($item['user_group'] == 1), а следовательно у этой записи count никогда не будет увеличен, а уже из этого следует, что у первых 2 записей (из-за сортировки по count) поле count обновлено тоже не будет, и больше ничего не будет на этом месте отображаться...

    Так вот как мне можно этого избежать???
     
  7. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Логично что убрать то условие, которое мешает.

    Сам поставил условие, сам его и убери.
    В чем вопрос-то?

    Или это топик из разряда детских шуток? вида - "отсоси не нагибаясь"?
     
  8. darkgod

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

    С нами с:
    31 мар 2008
    Сообщения:
    201
    Симпатии:
    0
    Simpliest
    Ты адекватный человек или нет? мне нужно делать апдейт только если выполняется условие...
     
  9. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Мда.
    Так он у тебя и делается только если выполняется условие :)
    Проблема в чем?

    И, да, из этого
    вовсе не следует это
    Это, кстати, о птичках :)
     
  10. darkgod

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

    С нами с:
    31 мар 2008
    Сообщения:
    201
    Симпатии:
    0
    не дождавшись помощи решил проблему сам... а вы так и не поняли что мне нужно было и почему не работало... хотя все очень просто!
     
  11. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Ты чертовски прав.

    Один дурак может задать задачку, которую не поймут и десяток мудрецов.
     
  12. darkgod

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

    С нами с:
    31 мар 2008
    Сообщения:
    201
    Симпатии:
    0
    Simpliest
    задачки то и небыло... можно было посмотреть на 2 запроса и понять что делает каждый из них... А если логика не развита, то и не объяснишь
     
  13. Silicium

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

    С нами с:
    1 апр 2008
    Сообщения:
    205
    Симпатии:
    0
    Адрес:
    Киев
    +1