Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выборка по 30 неиндексированным полям 
:(
    Опции темы
Aliance
Дата 10.1.2007, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 3
Всего: 137



Такая проблема, в структуре БД у меня есть 30 полей с названиями mater1, mater2, ..., mater30.
Я делаю выборку 1 строчки по primary key - `id`. В этих полях по умолчанию содержатся нули, но могут быть и положительные цифры. Как бы пробежаться по всем этим 30 полям, чтобы это было как можно более эффективно и не грузило сервер и страницу соответственно.
Гробо говоря:
Код

for ($i = 1; $i <= 30; $i++) {
   $result = mysql_query("SELECT * FROM `table` WHERE `id` = ID AND `mater`" . $i . " > 0 LIMIT 1;", $link);
}


Возможно стоить перестроить структуру БД, потому как выборка производится по этим 30 полям, а они не являются индексами (их 30, а индексов можно сделать 16)

Это сообщение отредактировал(а) Aliance - 10.1.2007, 16:21
PM MAIL WWW ICQ Skype   Вверх
GZep
Дата 10.1.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

Репутация: -1
Всего: 32



Надо LIMIT поставить, чтобы 30 записей вытаскивал.
Код

$result = mysql_query("SELECT * FROM `table` WHERE `id` = ID AND `mater`" . $i . " > 0 LIMIT 0, 30", $link);


Это сообщение отредактировал(а) GZep - 10.1.2007, 16:22


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
Mal Hack
Дата 10.1.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 11
Всего: 261



А никак сделать одно поле, но множеством?
PM ICQ   Вверх
Aliance
Дата 10.1.2007, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 3
Всего: 137



Цитата(Mal Hack @  10.1.2007,  17:21 Найти цитируемый пост)
А никак сделать одно поле, но множеством? 

Это как? Боюсь если я тебя правильно понял, то тогда моя БД не будет удоволетворять 1НФ.
PM MAIL WWW ICQ Skype   Вверх
Mal Hack
Дата 10.1.2007, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 11
Всего: 261



1 НФ тут не при чем.
Скажи для чего эти поля, какие у них значения и как могут изменяться
PM ICQ   Вверх
Aliance
Дата 10.1.2007, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 3
Всего: 137



У меня есть грубо говоря каталог предметов для игры, некоторые предметы характеризируются не только ценой, но и опр. количеством опр. предметов mater1-mater30. Например, предмет нож характеризируется только ценой, а предмет меч характеризируется еще наличием 2 mater10 и 8 mater21. Описание этих mater1-30 содержится в другой таблице. Вот.
PM MAIL WWW ICQ Skype   Вверх
GZep
Дата 10.1.2007, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

Репутация: -1
Всего: 32



Тут, вроде только если один очень длинный запрос составить можно или выбрать все записи и отсеять лишние уже с помощью PHP.


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
Mal Hack
Дата 10.1.2007, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 11
Всего: 261



Aliance, грубо говоря тебе надо отразить как бы для I'той записи принадлежность к ней цифры (предмета) 1, 2 ... 30.
Делаешь поле множеством, впихиваешь туда значения от 1 до 30. И все. Запрос упрощается и работа в сто раз.
http://dev.mysql.com/doc/refman/4.1/en/set.html
PM ICQ   Вверх
Dremlin
Дата 10.1.2007, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Quo vadis?
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 21.9.2006
Где: Киев

Репутация: 2
Всего: 4



Цитата(Aliance @  10.1.2007,  15:32 Найти цитируемый пост)
У меня есть грубо говоря каталог предметов для игры, некоторые предметы характеризируются не только ценой, но и опр. количеством опр. предметов mater1-mater30. Например, предмет нож характеризируется только ценой, а предмет меч характеризируется еще наличием 2 mater10 и 8 mater21. Описание этих mater1-30 содержится в другой таблице. Вот. 

При такой постановке задачи, мне кажется, что косяк в структуре БД. ИМХО, надо бы так:

predmet
-id
-opisanie_i_drugie_polya

mater
-id
-opisanie_i_drugie_polya

predmet_mater
-id_predmet
-id_mater
-kolichestvo

Тогда и запросы упростятся и структура прозрачней и понятней будет
--------------------
Каждый дурак знает, что до звезд не достать, а умные, не обращая внимания на дураков, пытаются...
PM MAIL   Вверх
Bikutoru
Дата 10.1.2007, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 2
Всего: 22



Цитата(Aliance @  10.1.2007,  17:32 Найти цитируемый пост)
У меня есть грубо говоря каталог предметов для игры, некоторые предметы характеризируются не только ценой, но и опр. количеством опр. предметов mater1-mater30. Например, предмет нож характеризируется только ценой, а предмет меч характеризируется еще наличием 2 mater10 и 8 mater21.


Если я все правильно понял, то такая структура базы не очень хороша. Получается, что у тебя большое количество полей в каждой отдельно взятой записи просто не нужны (например, в записи, соответствующей предмету "нож" все 30 полей пустуют). 
В этом случае мне видится два пути:

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

Вариант 2. Сделать две таблицы: "предметы", в которой предметы просто перечисляются (без характеризующих их параметров), и "параметры", в которой хранится список параметров. После чего сделать третью таблицу, которая содержит значение параметра с заданным id для предмета с заданным (но другим, конечно же) id. Плюс данного решения: возможность написания скриптика, который автоматически перельет значения в новую структуру. Минусы: оно более медленное по сравнению с предыдущим...

В качестве примера приведу кусок из одного своего проекта:

Код

-- В твоих терминах "предметы"
CREATE TABLE `models` (
  `id` int(11) NOT NULL auto_increment,
  `modelname` varchar(30) NOT NULL default '',
  PRIMARY KEY  (`id`)
);

-- В твоих терминах "параметры"
CREATE TABLE `models_params` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(50) NOT NULL default '',
  PRIMARY KEY  (`id`)
);

-- Значения конкретного параметра для конкретного предмета
CREATE TABLE `models_params_values` (
  `model_id` int(11) NOT NULL default '0',
  `param_id` int(5) NOT NULL default '0',
  `value` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`model_id`,`param_id`)
);


Добавлено @ 16:57 
Dremlin, опередил, а я столько писал :-)

Это сообщение отредактировал(а) Bikutoru - 10.1.2007, 17:05


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Mal Hack
Дата 10.1.2007, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 11
Всего: 261



Я не понимаю, чем множество не устраивает? :_
PM ICQ   Вверх
Aliance
Дата 10.1.2007, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 3
Всего: 137



Dremlin, над этим думал, но сомневался. Спасибо. Вопрос такой: в третьей таблице predmet_mater что сделать индексом?

Mal Hack, может быть я туплю, но не вижу вообще как оно тут может пригодится. У каждого предмета либо вообще нет mater, либо их больше 1. Поэтому полей все равно 30 должно быть, а уж какие они будут сильно не влияет на общую логику. В общем решил сделать так, как предложил дремлин.
PM MAIL WWW ICQ Skype   Вверх
Mal Hack
Дата 10.1.2007, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 11
Всего: 261



Цитата(Aliance @  10.1.2007,  20:21 Найти цитируемый пост)
Mal Hack, может быть я туплю, но не вижу вообще как оно тут может пригодится. 

очень просто...
Смотри есть таблица соответствий
mater1 - 1
mater2 - 2
...
mater3 - 3
Есть таблица с предметами (нож, копье). Есть поле maters в нем, для ножа - пустое множество, для копья множество {1,2}, для другого предмета - свое, т.е. указывается только то, что есть.
PM ICQ   Вверх
Aliance
Дата 10.1.2007, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 3
Всего: 137



Mal Hack, в твоец таблице соответсвий второй столбец - это id?
Проблема в том, что каждого mater может быть по несколько штук. Например в копье 3 - mater1, 2 - mater5, 1 - mater16 и 15 - mater24.

Кстати, сделал как предложил Dremlin, но не понятно, как выброрку сделать. Поясняю:
у меня 4 таблицы: encyclopedia, items, member_items и encyclopedia_items.
Первая - список всех вещей, структура такова: ид вещи, название, характеристики.
Вторая - список всех ингридиентов, структура такова: ид ингридиента, характеристики.
Третья - список вещей у каждого пользователя, структура такова: ид пользователя, ид вещи (связано со второй таблицей), количество.
Четвертая - список вещей требующихся для предмета, структура такова: ид предмета (связано с первой таблицей), ид вещи (связано со второй таблицей), количество.

Как мне узнать, какой пользователь сможет купить вещь определенную? Я знаю ид вещи и хочу проверить, у кого есть необходимые для нее ингридиенты.
Тоесть мне нужно в третьей таблице найти всех пользователей, у который есть нужные мне ингридиенты в нужной кол-ве. Но тут загвоздка, делаю так: выбираю из 3 таблицы всех пользователей, у которых есть нужное количество первого ингридиента UNION тоже самое со вторым UNION и так далее. Но сдесь есть пользователи, у которых есть первый ингридиент, но нет второго, скажем. Если обойтись без объединения запросов, то как?
Код

SELECT * FROM `member_items` WHERE `ид вещи` = известное ид AND `количество` >= требуемому количеству

Работает, но это при условии, что для вещи с ид "известное ид" требуется только 1 ингридиент.

В общем, тупик.

Надеюсь более менее понятно написал, если нет - придется выкладывать дамп БД упрощенный. Буду признателен за помощь.
PM MAIL WWW ICQ Skype   Вверх
Mal Hack
Дата 10.1.2007, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 11
Всего: 261



Цитата(Aliance @  10.1.2007,  21:12 Найти цитируемый пост)
Mal Hack, в твоец таблице соответсвий второй столбец - это id?

Первый - индекс предмета.
Второй - множество mater'ов.

Цитата(Aliance @  10.1.2007,  21:12 Найти цитируемый пост)
Проблема в том, что каждого mater может быть по несколько штук. Например в копье 3 - mater1, 2 - mater5, 1 - mater16 и 15 - mater24.

Тебе это информация нужна для показа инфы, так? А не для поиска.
Тогда организуй свое множество через строку.
1-5|2-4|30-1
первое число - meter, второе - кол-во.
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0757 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.