[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вытащить одним запросом последние три записи и...
Страницы: 1, 2
Hello
Цитата (AllesKlar @ 2.12.2014 - 23:28)
Цитата (twin @ 3.12.2014 - 00:20)
Вообще это не один запрос, а 4 получается. Вложенный будет выполняться для каждой строки.

Не буду утвержать на 100%, но думаю, что подзапрос после первого раза закешируется.

И давно у вас подзапросы кешируются?
Цитата
The cache is not used for queries of the following types:

   

  • Queries that are a subquery of an outer query



_____________
VPS от 5$, первые 2 месяца - бесплатно.
twin
Цитата (AllesKlar @ 3.12.2014 - 06:06)
twin
Вот этим и отличается инженер от математика.
Инженер возьмет и сделает, а математик вытрахает мозг, причем без гарантии, что будет что-то сделано вообще smile.gif

Если инженер не дружит с математикой, он не инженер, а лапотник. И сделает как раз все сикось-накось. В простонародье тяп-ляп. smile.gif

Анекдот напомнить про "чего тут думать, прыгать надо"?

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
AllesKlar
Hello
пфф... не надо вот непонятными цитатами кидаться, я тож могу, смори:
Цитата
Rewriting the function call into a scalar subquery allows Oracle to use scalar subquery caching to optimize the number of function calls needed to complete the query.

Пруф: http://oracle-base.com/articles/misc/effic...ubquery-caching
Круто, да? И все кешируется

_____________
[продано копирайтерам]
S.Chushkin
Цитата (twin @ 3.12.2014 - 09:56)
А и то и другое нужно считать запросом. Запрос - это обращение за данными. И не важно, где они находятся, на другом сервере, в ФС или кэше. Но так, как запрос к СУБД неизбежен, его можно не считать.
...

Вы не правы.
Запросом принято считать то, что выполняется атомарно (грубо говоря, - до ";"). Всё остальное - подзапросы. А то, что Вы называете "обращение за данными" это другое.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
Hello
AllesKlar а с каких по oracle стал default db для php?
Скрытый текст
да, mysql - default db когда спрашиваю про sql на php форумах


_____________
VPS от 5$, первые 2 месяца - бесплатно.
AllesKlar
Hello
Ок, ты победил.
Вот твой приз: отличная электронная книжка

_____________
[продано копирайтерам]
twin
Цитата (S.Chushkin @ 3.12.2014 - 06:33)
Запросом принято считать то, что выполняется атомарно (грубо говоря, - до ";"). Всё остальное - подзапросы. А то, что Вы называете "обращение за данными" это другое.

Вот именно. Принято считать. Одно слово только пропущено: ошибочно принято считать. Я про то и говорил::
Цитата
А принято считать как раз его, так как все, что внутри ошибочно принимается за один запрос.


Дело в том, что СУБД глубоко плевать, что тут у вас принято и как вы это называете. Она выполняет запрос. Где бы он не находился. Снаружи или внутри другого. Поэтому подзапрос, это такой же полноценный запрос. С тем же обращением к хранилищу данных.



_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Kusss
SELECT 
SQL_CALC_FOUND_ROWS
id
FROM
`table`
ORDER BY
id DESC
LIMIT

0, 3

$sql = "запрос выше";
$sql = mysql_query($sql);
while ($row = mysql_fetch_assoc($sql)) {
echo '<br>'.$row['id'];
}
$sql = mysql_query("SELECT FOUND_ROWS()");
$all = mysql_fetch_assoc($sql);
echo '<br>Все записей : '.$all['FOUND_ROWS()'];

А ещё можно вот так :)
twin
Можно, я и говорил про два запроса. Только такой вариант хорош при сложном запросе с условиями. При обычном достаточно COUNT(*) вторым запросом.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
sergeiss
Цитата (twin @ 3.12.2014 - 09:56)

Цитата
ОДНИМ запросом выбираем 3 записи, считаем общее количество записей в таблице (гарантированно только один раз будет подсчет сделан).
Там 4 запроса, не считая межсерверный. И нечево пудрить мозги.

Под словом "запрос" я понимаю (и чаще всего и другие тоже) те запросы, что передаются функции типа mysql_query() или pg_query(). Именно их количество чаще всего является критичным для скорости выполнения.

Что же касается моего запроса с WITH, то это именно один запрос с несколькими подзапросами.

pg_query( 'WITH
top3 as
(select * from table_name order by id desc limit 3),
count_all as
(select count(*) as c from table_name)

select *, (select c from count_all) as count_records
from top3
order by id'
);


Николай, я тебя очень прошу :) Не придумывай "новую терминологию".

Если я попрошу БД сделать EXPLAIN моего запроса, то получу ОДИН ответ, а не 4, как можно бы предположить по твоему ответу. И из этого одного ответа ну никак нельзя будет вытащить 4 разных запроса.

Вот я даже картинку скопировал, которую мне Постре рисует в качестве EXPLAIN. Тут таблица называется people и ее айдишник people_id - всё остальное в запросе то же самое, что и в моем примере.

Надеюсь, ты не будешь доказывать, что разработчики Постгре не понимают, о чем говорят и что делают? ;)



_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
twin
sergeiss
Сереж, ничего я не придумываю. Открой любой мануал и посмотри, является ли подзапрос запросом. Это вы напридумали черти чё.

Хотя бы конкретизировали бы. "За одно обращение к субд". Или "за один запрос к субд".

Ведь вот это тоже будет по вашей версии считаться одним запросом

SELECT  a.*,  (SELECT b.`id` FROM  `table2` b WHERE b.`id` = a.`id_parent`) AS `pid`
FROM `table1` a WHERE a.`date` < CURDATE()


На вид все простенько, однако если искомых строк в table1 окажется 1000, то будет выполнен 1001 запрос. Хоть как их называй, подзапросы, субзапросы, черти лысые. Количество от этого не уменьшится. И скорость выборки не увеличится от того, что
Цитата
Под словом "запрос" я понимаю (и чаще всего и другие тоже) те запросы, что передаются функции типа mysql_query() или pg_query().


Хотя очевидно, что эта задача решается всего двумя раздельными запросами.

Вот тебе и терминология.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
S.Chushkin
Цитата (twin @ 3.12.2014 - 11:19)
Дело в том, что СУБД глубоко плевать, что тут у вас принято и как вы это называете. Она выполняет запрос. Где бы он не находился. Снаружи или внутри другого. Поэтому подзапрос, это такой же полноценный запрос. С тем же обращением к хранилищу данных.

"Вот именно!"
Что там фактически делает сервер, 1 запрос, четыре или миллион, мне, как клиенту, глубоко наплевать - это его проблемы. И на подзапросы наплевать. Мне приходится их учитывать только потому, что сервер не идеален, т.е. чтобы заставить его выполнять мой запрос наиболее эффективно.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
twin
S.Chushkin
Ну если вам наплевать, что там делает сервер, о чем речь. Хозяин - барин. Можно и в цикл сунуть.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
twin
sergeiss
Цитата
Если я попрошу БД сделать EXPLAIN моего запроса, то получу ОДИН ответ, а не 4, как можно бы предположить по твоему ответу. И из этого одного ответа ну никак нельзя будет вытащить 4 разных запроса
Это естественнно. EXPLAIN не делается для субзапросов. В этом еще один их минус.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
inpost
Kusss
mysqli_query($db,"
SELECT COUNT(*);
SELECT ... LIMIT 3;
"
);


_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.