Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: помогите составить запрос...(оптимизация)
 
 автор: Brandon Hit   (08.02.2006 в 15:55)   письмо автору
 
 

имеется таблица items следующего формата(все поля - int)
|id|mat1|count1|mat2|count2|mat3|count3|
и таблица inventory формата(все поля - int)
|id_owner|type_mat|

$id=$_GET['id'];

$query=mysql_query("SELECT * FROM items WHERE id=$id");
$result=mysql_fetch_array($query);

$query=mysql_query("SELECT COUNT(*) FROM inventory WHERE type_mat='".$result['mat1']."' ");
if (mysql_num_rows($query)>$result['count1'])
{
$query=mysql_query("SELECT COUNT(*) FROM inventory WHERE type_mat='".$result['mat2']."' ");
if (mysql_num_rows($query)>$result['count2'])
{
$query=mysql_query("SELECT COUNT(*) FROM inventory WHERE type_mat='".$result['mat3']."' ");
if (mysql_num_rows($query)>$result['count3'])
{
echo 'Все в порядке.';exit;
} else $err=true;
} else $err=true;
} else $err=true;

if ($err=='true') {echo 'Ошибка! У Вас не хватает мат-ов.';}

Собственно, последние 3 запроса хотелось бы объединить в один, если, конечно, такое возможно.

   
 
 автор: WebTech   (08.02.2006 в 18:08)   письмо автору
 
   для: Brandon Hit   (08.02.2006 в 15:55)
 

Ага!
Странные конструкции. Запрос типа

SELECT COUNT(*) FROM inventory WHERE type_mat=$result['mat1']

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

mysql_num_rows($query)>$result['count1']

скорее вcего вы хотели что-то типа

$query=mysql_query("SELECT COUNT(*) as cnt FROM inventory WHERE type_mat='".$result['mat1']."' ");
if (mysql_result($query, 0, 'cnt')>$result['count1'])

Скажите на словах, что пытаетесь добиться. Тогда попробуем составить запрос

   
 
 автор: Brandon Hit   (09.02.2006 в 04:07)   письмо автору
 
   для: WebTech   (08.02.2006 в 18:08)
 

ой:)
Вообщем, в таблице inventory хранится инвентарь игрока. Надо бы проверить, достаточно ли у игрока необходимых ресурсов. mat1, mat2, mat3 - type_mat в inventory; count1, count2, count3 - необходимое кол-во ресурсов.

   
 
 автор: WebTech   (09.02.2006 в 10:32)   письмо автору
 
   для: Brandon Hit   (09.02.2006 в 04:07)
 

Т.е. mat1, mat2, mat3 - имеющееся кол-во ресурсов, а count1, count2, count3 - необходимое кол-во ресурсов и нужно проверить, чтобы mat было => count? Тогда зачем таблица inventory?

   
 
 автор: Brandon Hit   (09.02.2006 в 14:17)   письмо автору
 
   для: WebTech   (09.02.2006 в 10:32)
 

Нет:)
Сейчас объясню...
Переделал таблицы, дал нормальные названия полям и теперь у них такой формат:

-- Структура таблицы 'game_items'

CREATE TABLE 'game_items' (
  'id_item' int(11) NOT NULL auto_increment,
  'name' text NOT NULL,
  'material1' int(11) NOT NULL default '0',
  'count1' int(11) NOT NULL default '0',
  'material2' int(11) NOT NULL default '0',
  'count2' int(11) NOT NULL default '0',
  'material3' int(11) NOT NULL default '0',
  'count3' int(11) NOT NULL default '0',
  PRIMARY KEY  ('id_item')
) TYPE=MyISAM AUTO_INCREMENT=9 ;

-- Дамп данных таблицы 'game_items'

INSERT INTO 'game_items' VALUES (1, 'Кусок железа.', 0, 0, 0, 0, 0, 0);
INSERT INTO 'game_items' VALUES (2, 'Сталь', 0, 0, 0, 0, 0, 0);
INSERT INTO 'game_items' VALUES (3, 'Бронза', 0, 0, 0, 0, 0, 0);
INSERT INTO 'game_items' VALUES (4, 'Серебро', 0, 0, 0, 0, 0, 0);
INSERT INTO 'game_items' VALUES (5, 'Золото', 0, 0, 0, 0, 0, 0);
INSERT INTO 'game_items' VALUES (6, 'Мефрил', 0, 0, 0, 0, 0, 0);
INSERT INTO 'game_items' VALUES (7, 'Шлем воина', 1, 3, 0, 0, 0, 0);
INSERT INTO 'game_items' VALUES (8, 'Меч Силы', 1, 3, 3, 2, 5, 1);

Это была таблица предметов, которые естьв игре.
material1, material2, material3 - номера предметов в game_items, необходимые для создания этого предмета.
count1, count2, count3 - необходимое количество предметов (material1, material2, material3) для создания этого предмета.
Т.е. например, для Шлема воина надо 3 железа, а чтобы создать Меч силы - 3 железа, 2 бронзы и 1 кусок золота.

а вот такая структура у game_inventory

-- Структура таблицы 'game_inventory'

CREATE TABLE 'game_inventory' (
  'id_owner' int(11) NOT NULL default '0',
  'id_item' int(11) NOT NULL default '0'
) TYPE=MyISAM;

-- Дамп данных таблицы 'game_inventory'

INSERT INTO 'game_inventory' VALUES (1, 1);
INSERT INTO 'game_inventory' VALUES (1, 1);
INSERT INTO 'game_inventory' VALUES (1, 1);
INSERT INTO 'game_inventory' VALUES (1, 5);

id_owner - владелец предметов();
id_item для связи с game_items через id_item

Вся трудность в том, что в таблице предметы хранятся в формате 1 запись - 1 предмет.
Т.е. у меня сецчас в game_inventory 3 куска железа и 1 кусок золота.
Внимание, теперь задача:)
Нужно проверить достаточно ли у игрока предметов для создания других предметов:)

   
 
 автор: WebTech   (09.02.2006 в 15:33)   письмо автору
 
   для: Brandon Hit   (09.02.2006 в 14:17)
 

Для создания какого-либо предмета требуется не более 3-х других предметов? Или может быть больше? Судя по таблице, не более 3-х.

   
 
 автор: Brandon Hit   (09.02.2006 в 15:44)   письмо автору
 
   для: WebTech   (09.02.2006 в 15:33)
 

да, не более трех других видов, но необходимое количество этих видов различно.

   
 
 автор: WebTech   (11.02.2006 в 15:50)   письмо автору
 
   для: Brandon Hit   (09.02.2006 в 15:44)
 

Что-то не получается все одним запросом сделать :-( Будем еще подумать...

   
 
 автор: Brandon Hit   (11.02.2006 в 18:32)   письмо автору
 
   для: WebTech   (11.02.2006 в 15:50)
 

да наверное, и не получится=(

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования