[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Результаты SQL-запросов
Mescalero
Недавно взялся за PHP, дошел до работы с MySQL и сразу возникла пара вопросов по поводу того, как mysql_query возвращает результаты. Удивляет меня вот что:
1. результат различных SELECT-ов: почему бы не возвращать его в виде массива сразу, а не в виде неудобоваримого ресурса, из которого потом инфу приходится по одной строчке выковыривать?
Если результатом селекта будет таблица из 5 строк, то чтобы вывести её на экран, к примеру, мы же все равно 5 раз вызываем функцию типа mysql_fetch_... и все равно получаем массивы на выходе, так почему бы не вернуть сразу массив и работать с ним напрямую, чтобы избежать этих ненужных вызовов функций?

2. Результат запросов вида "SELECT count(*)..." вообще удивил: делая такой запрос, программист желает получить количество записей, т.е. просто одно единственное число. Зачем возвращать какую-то извратную таблицу с одной единственной ячейкой, из которой результат надо выковыривать, используя лишний вызов функции?

Я понимаю, что разработчики PHP люди не глупые и опыта у них явно поболее моего, поэтому хочу просто разобраться, почему сделали именно так.
Так что прошу мои вопросы не воспринимать как вопли типа "они все дураки, а я гений, хоть и новичек!" smile.gif

P.S. Есть подозрение, что select-ы и count(*) не всегда используют так примитивно, как я сейчас - поэтому и результаты возвращают именно в таком виде. Может кто примерчик подскажет, где это оправдано?



Спустя 1 час, 42 минуты, 55 секунд (1.10.2011 - 15:01) Winston написал(а):
Цитата (Mescalero @ 1.10.2011 - 13:19)
мы же все равно 5 раз вызываем функцию типа mysql_fetch_

Ты пять раз подряд пишешь mysql_fetch_assoc ? blink.gif
Для этого существует цикл while и другие smile.gif
Цитата (Mescalero @ 1.10.2011 - 13:19)
Так что прошу мои вопросы не воспринимать как вопли типа "они все дураки, а я гений, хоть и новичек!"

На первый взгляд так и выглядит smile.gif
Цитата (Mescalero @ 1.10.2011 - 13:19)
P.S. Есть подозрение, что select-ы и count(*) не всегда используют так примитивно, как я сейчас

Верно.
Цитата (Mescalero @ 1.10.2011 - 13:19)
Может кто примерчик подскажет, где это оправдано?

ТЫЦ и примеров завались smile.gif

Спустя 1 час, 11 минут, 48 секунд (1.10.2011 - 16:13) neadekvat написал(а):
Цитата (Winston @ 1.10.2011 - 16:01)
ТЫЦ и примеров завались

Да ну, слишком широкий запрос, чего там найти то можно полезного?

Цитата (Mescalero @ 1.10.2011 - 14:19)
1. результат различных SELECT-ов: почему бы не возвращать его в виде массива сразу, а не в виде неудобоваримого ресурса, из которого потом инфу приходится по одной строчке выковыривать?

Ты не учел, что ресурс можно использовать не только в mysql_fetch_*, но и в n-ом количестве других функций. Другими словами - ресурс - это не просто звено последовательной цепи, это точка, от которой расходится множество линий для возможного использования.

Цитата (Mescalero @ 1.10.2011 - 14:19)
Результат запросов вида "SELECT count(*)..." вообще удивил

Если нужно получить количество всех строк (только лишь это) и сами строки, то разумнее использовать функцию mysql_num_rows, а в select пихать поля, необходимые для выборки.
По поводу расширенного использования, о котором ты "догадываешься": обычно это используется для получения не количества всех строк, а по определенной группировке GROUP BY. Например, когда в каталоге товаров надо проставить количество товаров возле категорий, нужно пользоваться именно этим способом, а не делать отдельный SELECT COUNT(*) на каждую конкретную категорию, как частенько поступают новички.

Спустя 9 минут, 4 секунды (1.10.2011 - 16:22) Winston написал(а):
Цитата (neadekvat @ 1.10.2011 - 16:13)
Да ну, слишком широкий запрос, чего там найти то можно полезного?

Ну например четвертый результат очень даже не плохой smile.gif

Спустя 3 минуты, 6 секунд (1.10.2011 - 16:25) neadekvat написал(а):
Лучше б указал на свою подпись, намного полезнее. Причем для всех категорий программистов, как мне кажется.

Спустя 2 часа, 52 минуты, 25 секунд (1.10.2011 - 19:18) Mescalero написал(а):
Цитата (Winston @ 1.10.2011 - 12:01)
Цитата (Mescalero @ 1.10.2011 - 13:19)
мы же все равно 5 раз вызываем функцию типа mysql_fetch_

Ты пять раз подряд пишешь mysql_fetch_assoc ? blink.gif
Для этого существует цикл while и другие smile.gif

Это понятно, с циклами я знаком smile.gif Но в цикле то функция все равно вызывается N раз... Если я правильно помню, то работа напрямую с двумерным массивом будет явно быстрее, чем вызов функции на каждую строку.

Спустя 7 минут, 38 секунд (1.10.2011 - 19:25) Mescalero написал(а):
Цитата (Winston @ 1.10.2011 - 12:01)
Цитата (Mescalero @ 1.10.2011 - 13:19)
Может кто примерчик подскажет, где это оправдано?

ТЫЦ и примеров завались smile.gif

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

Спустя 1 день, 13 часов, 8 минут, 41 секунда (3.10.2011 - 08:34) linker написал(а):
Сразу видно, что человек либо первый раз сел за программирование, либо никогда не работал с базами данных.

1. Что такое сервер баз данных? Это набор баз данных. Что такое база данных? Это набор таблиц. Что такое таблица? Это набор вертикальных столбцов и горизонтальных записей. Пересечение столбца и записи - ячейка. В школе наверное рисовал таблицы. Запрос отдаёт нечто неудобоваримое, которое должно по желанию программиста превратиться во что-то осмысленное - массив. В PHP превращение из непонятного в понятное делается с помощью mysql_fetch_...(). Вот тут встаёт выбор, а что мне нужно. Вспоминаем, что столбцы - это именованные, так сказать поля таблицы, но также каждый столбце может индексироваться от 0 до N. Т.е. чтобы обратиться к определенной ячейки в записи мне нужно либо использовать индексы, то mysql_fetch_row(). Либо я обращаюсь по имени столбца, тогда mysql_fetch_assoc(). Я могу прервать цикл
while($row = mysql_fetch_assoc($res)) {}
по каким-либо причинам и тогда нахрена мне хранить массив всех записей. Плюс, в цикле я могу поэтапно группировать выбираемые элементы или делать с ними какие-то операции, нахрена мне целая куча массивов. Получается, что используя ссылку на ресурс Я ЖУТКО ЭКОНОМЛЮ ПАМЯТЬ.

2. Читаем что такое базы данных и что они возвращают (ни PHP, ни MySQL тут ни причём). Результатом любого запроса есть таблица результатов. Уж извини, но тебе придётся привыкнуть к этому. Именно поэтому, результатом COUNT() является таблица с одной строкой и одним столбцом. Хочешь ты или нет, но PHP похрену на то, что у тебя запросе написано SELECT COUT(), ему вообще похрену на твой запрос, ибо не PHP выполняет запросы, а MySQL. Дело PHP - это отдать тебе результаты работы MySQL, всё остальное - это твои проблемы.
Быстрый ответ:

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