Вложеные запросы (глупые вопросы)

Тема в разделе "Базы данных", создана пользователем CrashX, 24 фев 2011.

Модераторы: latteo
  1. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    такой вложеный запрос будет выполнятся для каждой записи или нет?
    или как можно подсчитать в 1 запросе количество строк и при этом выдать их с лимитом
     
  2. Mr.Emm

    Mr.Emm Постоялец

    Регистр.:
    5 май 2008
    Сообщения:
    147
    Симпатии:
    111
    Код:
    SQL_CALC_FOUND_ROWS
    
     
  3. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    эмммм
    некатит теже 2 запроса получается

    SELECT SQL_CALC_FOUND_ROWS * FROM table1 LIMIT 0, 10
    SELECT FOUND_ROWS()
    с тем же успехом count можно использовать, тут вопрос уже будет иначе кто быстрее и меньше полей затрагивает

    проведя очередные полевые эксперименты
    -
    вложенный запрос в запрос для подсчета каунт выполняется для каждой строки
    -мало того что время больше чем выполнить 2 запроса, еще и полей затрагивается в десятки раз больше, тк он выполняется для каждого и индексы полей не помогают.
    -так же расход памяти больше, тк на 1 поле больше.
    ---
    выход из моей ситуации другой кэширование запроса количества полей, до изменения количества полей в таблице, и пересоздание кэш только при добавлении, удалении, и ручном запросе (еще можно в крон поставить)


    теперь о том что лучше COUNT быстрее, чем SQL_CALC_FOUND_ROWS.
     
  4. Acidrayne

    Acidrayne

    Регистр.:
    30 сен 2007
    Сообщения:
    296
    Симпатии:
    20
    добрый день помогите составить запрос, делаю игру, в ней по крону нужно обновить значения например:

    PHP:
    mysql_query("UPDATE res SET ruda =ruda + 100[А вот тут мне нужно
     сделать выборку из другой таблицы и узнать уровень постройки
    , привязка идет по id например если уровень построки 2 прибавляем 100
     а если 3 то 100*3 таблица build постройка например rudnik]"
    );
     
  5. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    подобные вещи лучше процедурами, делать или динамическими запросами.
     
  6. Acidrayne

    Acidrayne

    Регистр.:
    30 сен 2007
    Сообщения:
    296
    Симпатии:
    20
    мне просто нужно обновить сразу все записи где уровень постройки например 3
     
  7. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    схему таблиц можешь сделать, я наглядно только понимаю)
    типа такой
    [​IMG]

    Добавлено через 17 минут
    UPDATE res, postroika SET res.ruda=res.ruda+100 WHERE res.megoID=postroika.megoID AND postroika.type='rudnik';
    UPDATE res, postroika SET res.ruda=res.ruda+100 WHERE res.megoID=postroika.megoID AND postroika.level=3;

    UPDATE res, postroika SET res.ruda=res.ruda+100*postroika.level WHERE res.megoID=postroika.megoID AND postroika.level=3;

    дальше сложнее... если делать с If то мутно проще, в скрипте динамически запросы сделать.
     
  8. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    363
    Симпатии:
    117
    но у твоего 1 запроса куча условий на сравнения ... объединение ... и подобная фигня ...

    чтоб сделать Лимит - СУБД нужно посчитать коунт, и при использовании SQL_CALC_FOUND_ROWS она там себе положит в нычку это количество строк ..

    а если потом еще выполнять запрос на коунт то СУБД будет вынуждена вновь выполнять ту кучу сравнений и объединений ...