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

CrashX

В прошлом XSiteCMS
Регистрация
6 Июн 2008
Сообщения
681
Реакции
114
SELECT (SELECT COUNT(public) FROM news where public <='2011-02-24 07:18:32') AS total ,
news.id, news.cid, news.aid, news.seo, news.title, news.content,
news.reference, news.hits, news.public, news.created,
users.ulogin, users.unick, users.uname, users.usurname,
news_category.alias, news_category.name, news_category.pid
FROM news LEFT OUTER JOIN users ON news.aid = users.id
LEFT OUTER JOIN news_category ON news.cid = news_category.id
WHERE news.public <='2011-02-24 07:18:32'
ORDER BY news.public
DESC LIMIT 0, 10;

такой вложеный запрос будет выполнятся для каждой записи или нет?
или как можно подсчитать в 1 запросе количество строк и при этом выдать их с лимитом
 
эмммм
некатит теже 2 запроса получается

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

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


теперь о том что лучше COUNT быстрее, чем SQL_CALC_FOUND_ROWS.
 
добрый день помогите составить запрос, делаю игру, в ней по крону нужно обновить значения например:

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


Добавлено через 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 то мутно проще, в скрипте динамически запросы сделать.
 
теперь о том что лучше COUNT быстрее, чем SQL_CALC_FOUND_ROWS.

но у твоего 1 запроса куча условий на сравнения ... объединение ... и подобная фигня ...

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

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