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

Форум MySQL

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

 

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

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

тема: Умножение/деление/вычитание/сложение данных из таблиц
 
 автор: ronalex   (09.06.2007 в 20:08)   письмо автору
 
 

Имеются две таблицы, как произвести между ними операции (Умножение/деление/вычитание/сложение) по столбикам sum

две таблицы объединяет имя пользователя:

Табица№1

name sum
-------- ------
user1 100
user2 200

Табица№2

name sum
-------- ------
user1 111
user2 222

   
 
 автор: Trianon   (09.06.2007 в 20:21)   письмо автору
 
   для: ronalex   (09.06.2007 в 20:08)
 

name - первичный ключ?
tab1 += tab2:

UPDATE tab1 
   JOIN tab2 USING(name)
SET `tab1.sum`=`tab1.sum` +`tab2.sum`

остальные аналогично

   
 
 автор: ronalex   (09.06.2007 в 20:56)   письмо автору
 
   для: Trianon   (09.06.2007 в 20:21)
 

так пробовал и неполучилось, в чём может быть проблема, пожалуйста подскажите

   
 
 автор: ronalex   (13.06.2007 в 08:55)   письмо автору
 
   для: ronalex   (09.06.2007 в 20:56)
 

откликнитесь, пожалуйста

name не ключ, а просто значение

   
 
 автор: Trianon   (13.06.2007 в 09:50)   письмо автору
 
   для: ronalex   (13.06.2007 в 08:55)
 

приводите структуры таблиц. А лучше фрагмент дампа структуры и данных, на которых рушится запрос.
Показывайте, как соединяются строки в этих таблицах.

   
 
 автор: ronalex   (13.06.2007 в 09:59)   письмо автору
 
   для: Trianon   (13.06.2007 в 09:50)
 

Вот дамп:

#
# Database structure for database 'ronalexj_hyip'
#

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `ronalexj_hyip` /*!40100 DEFAULT CHARACTER SET cp1251 */;

USE `ronalexj_hyip`;


#
# Table structure for table 'percent'
#

CREATE TABLE /*!32312 IF NOT EXISTS*/ `percent` (
  `name` varchar(255) default NULL,
  `percent` varchar(255) default NULL,
  `sum` varchar(255) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;



#
# Dumping data for table 'percent'
#

/*!40000 ALTER TABLE `percent` DISABLE KEYS*/;
LOCK TABLES `percent` WRITE;
REPLACE INTO `percent` (`name`, `percent`, `sum`) VALUES ('ronalex','0.35',NULL),
    ('ronalex','0.8',NULL),
    ('ronalex','10',NULL);
UNLOCK TABLES;
/*!40000 ALTER TABLE `percent` ENABLE KEYS*/;


#
# Table structure for table 'time'
#

CREATE TABLE /*!32312 IF NOT EXISTS*/ `time` (
  `name` varchar(255) default NULL,
  `time` varchar(255) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;



#
# Dumping data for table 'time'
#

/*!40000 ALTER TABLE `time` DISABLE KEYS*/;
LOCK TABLES `time` WRITE;
REPLACE INTO `time` (`name`, `time`) VALUES ('ronalex','34'),
    ('ronalex','2319'),
    ('ronalex','159');
UNLOCK TABLES;
/*!40000 ALTER TABLE `time` ENABLE KEYS*/;


вот запрос:

$qwerty=mysql_query("UPDATE `percent` JOIN `time` USING(ronalex) SET `percent.sum`=`percent.percent` +`time.time`");

   
 
 автор: Trianon   (13.06.2007 в 10:16)   письмо автору
 
   для: ronalex   (13.06.2007 в 09:59)
 

Попробуйте вот такой запрос:

$qwerty=mysql_query("UPDATE `percent` JOIN `time` USING(`name`) SET `percent`.`sum`=`percent`.`percent` +`time`.`time`");


Заработает.

Кроме того, структура таблицы не соответствует хранимым в ней данным.
Для хранения арифметических величин должны использоваться числовые, а не текстовые поля.
Соединяемые таблицы должны быть снабжены первичным и чужим ключами.
И индексами, построенными на этих ключах.

   
 
 автор: ronalex   (13.06.2007 в 10:19)   письмо автору
 
   для: Trianon   (13.06.2007 в 10:16)
 

ОГРОМНОЕ СПАСИБО!, всё заработало

   
 
 автор: ronalex   (13.06.2007 в 19:10)   письмо автору
 
   для: Trianon   (13.06.2007 в 10:16)
 

Уважаемый Trianon, Работает, только при таком запросе вносится в таблицу только первое значение, а их много, как мне передать все значения массиву и их помножить?
нужно умножить слолбик на столбик, а получается что умножается первое значение на весь другой столбик

   
 
 автор: Trianon   (13.06.2007 в 19:18)   письмо автору
 
   для: ronalex   (13.06.2007 в 19:10)
 

у меня изменяются все три строки.

Приводите пример.

   
 
 автор: ronalex   (13.06.2007 в 19:33)   письмо автору
 
   для: Trianon   (13.06.2007 в 19:18)
 

они изменяются, только у меня прибавляется на на одно значение например на +100
а надо весь столбик прибавить весь столбик, пример:

Табица - итог, так надо:

name sum
-------- ------
user1 100+111=211
user2 200+222=422

Получается вот так:

name sum
-------- ------
user1 100+111=211
user2 200+111=311-!!!!!!!!!!!!!!!!!!!!!!!!!!


Вот 2 таблицы:
Табица№1

name sum
-------- ------
user1 100
user2 200

Табица№2

name sum
-------- ------
user1 111
user2 222

   
 
 автор: Trianon   (13.06.2007 в 19:34)   письмо автору
 
   для: ronalex   (13.06.2007 в 19:33)
 

показывайте дамп исходных данных.

   
 
 автор: ronalex   (13.06.2007 в 19:38)   письмо автору
 
   для: Trianon   (13.06.2007 в 19:34)
 


# HeidiSQL Dump 
#
# --------------------------------------------------------
# Host:                 127.0.0.1
# Database:             ronalexj_hyip
# Server version:       5.0.18-nt
# Server OS:            Win32
# Target-Compatibility: MySQL 5.0
# Extended INSERTs:     Y
# max_allowed_packet:   1048576
# HeidiSQL version:     3.0 Revision: 572
# --------------------------------------------------------

/*!40100 SET CHARACTER SET cp1251*/;


#
# Database structure for database 'ronalexj_hyip'
#

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `ronalexj_hyip` /*!40100 DEFAULT CHARACTER SET cp1251 */;

USE `ronalexj_hyip`;


#
# Table structure for table 'customer'
#

CREATE TABLE /*!32312 IF NOT EXISTS*/ `customer` (
  `name` varchar(255) NOT NULL default '' COMMENT 'Имя для входа',
  `email` varchar(255) NOT NULL default '' COMMENT 'Электронная почта',
  `password` varchar(255) NOT NULL default '' COMMENT 'Пароль',
  `repassword` varchar(255) NOT NULL default '' COMMENT 'Повтор пароля',
  `regdate` date NOT NULL default '0000-00-00' COMMENT 'Дата регистрации',
  `icq` varchar(255) NOT NULL default '' COMMENT 'Номер ICQ',
  `egold` varchar(255) NOT NULL default ''
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;



#
# Dumping data for table 'customer'
#

/*!40000 ALTER TABLE `customer` DISABLE KEYS*/;
LOCK TABLES `customer` WRITE;
REPLACE INTO `customer` (`name`, `email`, `password`, `repassword`, `regdate`, `icq`, `egold`) VALUES ('ronalex','mail@webpixel.ru','85208520','85208520','2007-05-17','310361',''),
    ('wiazo','wiazo@mail.ru','611010','611010','2007-06-03','137667341','3128132');
UNLOCK TABLES;
/*!40000 ALTER TABLE `customer` ENABLE KEYS*/;


#
# Table structure for table 'holding'
#

CREATE TABLE /*!32312 IF NOT EXISTS*/ `holding` (
  `name` varchar(255) NOT NULL default '',
  `insum` varchar(255) NOT NULL default '',
  `money` varchar(255) NOT NULL default '',
  `interest_money` varchar(255) default NULL,
  `indate` datetime default NULL,
  `intime` time NOT NULL default '00:00:00',
  `incommentary` varchar(255) NOT NULL default ''
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;



#
# Dumping data for table 'holding'
#

/*!40000 ALTER TABLE `holding` DISABLE KEYS*/;
LOCK TABLES `holding` WRITE;
REPLACE INTO `holding` (`name`, `insum`, `money`, `interest_money`, `indate`, `intime`, `incommentary`) VALUES ('ronalex','50','',NULL,'2007-05-09 15:45:05','00:00:00',''),
    ('ronalex','100','',NULL,'2001-02-05 05:05:05','00:00:00',''),
    ('ronalex','1000','',NULL,'2007-01-05 05:05:05','00:00:00',''),
    ('120120','1200','',NULL,'2007-03-05 05:05:05','00:00:00','');
UNLOCK TABLES;
/*!40000 ALTER TABLE `holding` ENABLE KEYS*/;


#
# Table structure for table 'payment'
#

CREATE TABLE /*!32312 IF NOT EXISTS*/ `payment` (
  `name` varchar(255) NOT NULL default '',
  `outsum` varchar(255) NOT NULL default '',
  `outdate` date NOT NULL default '0000-00-00',
  `outtime` time NOT NULL default '00:00:00',
  `outcommentary` varchar(255) NOT NULL default ''
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;



#
# Dumping data for table 'payment'
#

/*!40000 ALTER TABLE `payment` DISABLE KEYS*/;
LOCK TABLES `payment` WRITE;
REPLACE INTO `payment` (`name`, `outsum`, `outdate`, `outtime`, `outcommentary`) VALUES ('ronalex','765','2007-06-03','16:06:38','кенкн'),
    ('ronalex','45','2007-06-03','16:06:52','кенкн');
UNLOCK TABLES;
/*!40000 ALTER TABLE `payment` ENABLE KEYS*/;


#
# Table structure for table 'percent'
#

CREATE TABLE /*!32312 IF NOT EXISTS*/ `percent` (
  `name` varchar(255) default NULL,
  `percent` varchar(255) default NULL,
  `sum` varchar(255) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;



#
# Dumping data for table 'percent'
#

/*!40000 ALTER TABLE `percent` DISABLE KEYS*/;
LOCK TABLES `percent` WRITE;
REPLACE INTO `percent` (`name`, `percent`, `sum`) VALUES ('ronalex','0.35','35.35'),
    ('ronalex','0.8','35.8'),
    ('ronalex','10','45');
UNLOCK TABLES;
/*!40000 ALTER TABLE `percent` ENABLE KEYS*/;


#
# Table structure for table 'time'
#

CREATE TABLE /*!32312 IF NOT EXISTS*/ `time` (
  `name` varchar(255) default NULL,
  `time` varchar(255) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;



#
# Dumping data for table 'time'
#

/*!40000 ALTER TABLE `time` DISABLE KEYS*/;
LOCK TABLES `time` WRITE;
REPLACE INTO `time` (`name`, `time`) VALUES ('ronalex','35'),
    ('ronalex','2319'),
    ('ronalex','159');
UNLOCK TABLES;
/*!40000 ALTER TABLE `time` ENABLE KEYS*/;




<?php
#Подключаемсяк БД и начинаем сессию
session_start();
    if(!isset(
$user))
        {
            
header("Location: ../handler.php");
            exit;
        }
include 
"../.config";

#Удаляем все данные из таблиц `percent` и `time`
$DELETE_PERCENT_QUERY=mysql_query("DELETE FROM `percent`");
$DELETE_TIME_QUERY=mysql_query("DELETE FROM `time`");

#Получаем из таблицы `holding` время в секундах и присваиваем к переменной $TIME время в днях, привелегии только для опредённого 'user'
$TIME_QUERY=mysql_query("SELECT UNIX_TIMESTAMP(`indate`) AS indate FROM `holding` WHERE name='".$_SESSION['user']."'");
    while(
$MYSQL_FETCH_ARRAY_TIME_QUERY=mysql_fetch_array($TIME_QUERY))
        {
            
$TIME=floor(($time=time()-$MYSQL_FETCH_ARRAY_TIME_QUERY[indate])/60/60/24);
            echo 
$TIME."<br><table width='100%' border='0' cellspacing='0' cellpadding='0' bgcolor='#f6e0f' height='1'><tr><td></td></tr></table>";
            
            
#Вставляем в таблицу `time` промежуток времени в днях соответствуя 'user'
            
$pTIME_QUERY=mysql_query("INSERT INTO `time`(`name`, `time`) VALUES('".$_SESSION['user']."', '$TIME')");
        }

echo 
"<br>";

#Получаем из таблицы `holding` сумму и переводим её в проценты и заносим в `percent`, привелегии только для опредённого 'user'
$INTEREST_MONEY_QUERY=mysql_query("SELECT * FROM `holding` WHERE name='".$_SESSION['user']."'");
    while(
$MYSQL_FETCH_ARRAY_INTEREST_MONEY=mysql_fetch_array($INTEREST_MONEY_QUERY))
        {
            if (
$MYSQL_FETCH_ARRAY_INTEREST_MONEY[insum] <= 99)
            
$INTEREST_MONEY=$MYSQL_FETCH_ARRAY_INTEREST_MONEY[insum]*0.007;
                elseif (
$MYSQL_FETCH_ARRAY_INTEREST_MONEY[insum] <= 499)
                    
$INTEREST_MONEY=$MYSQL_FETCH_ARRAY_INTEREST_MONEY[insum]*0.008;
                    elseif (
$MYSQL_FETCH_ARRAY_INTEREST_MONEY[insum] <= 999)
                        
$INTEREST_MONEY=$MYSQL_FETCH_ARRAY_INTEREST_MONEY[insum]*0.009;
                        elseif (
$MYSQL_FETCH_ARRAY_INTEREST_MONEY[insum] <= 100000)
                            
$INTEREST_MONEY=$MYSQL_FETCH_ARRAY_INTEREST_MONEY[insum]*0.010;
                            else echo 
"Сумма Больше 100000";
            echo 
$INTEREST_MONEY."<br><table width='100%' border='0' cellspacing='0' cellpadding='0' bgcolor='#f6e0f' height='1'><tr><td></td></tr></table>";
    
            
#Вставляем в таблицу `percent` сумму в процентах соответствуя 'user'
            
$PERCENT_QUERY=mysql_query("INSERT INTO `percent`(`name`, `percent`) VALUES('".$_SESSION['user']."', '$INTEREST_MONEY')");
            
$qwerty=mysql_query("UPDATE `percent` JOIN `time` USING(`name`) SET `percent`.`sum`=`percent`.`percent` +`time`.`time`");

?>

   
 
 автор: Trianon   (13.06.2007 в 19:42)   письмо автору
 
   для: ronalex   (13.06.2007 в 19:38)
 

В том же самом, как Вы выражаетесь, дампе, в строках не различаются имена пользователей.
и они всяко не равны тому, что Вы написали в примере

   
 
 автор: ronalex   (13.06.2007 в 19:58)   письмо автору
 
   для: Trianon   (13.06.2007 в 19:42)
 

это я просто для примера написал про две таблицы, мне главно суть уловить, можно ли как -нибудь передать данные из бд массиву, чтобы ими потом было легко управлять

   
 
 автор: ronalex   (13.06.2007 в 21:21)   письмо автору
 
   для: ronalex   (13.06.2007 в 19:58)
 

Вывожу конкретные данные и формирую вопрос:


$qwerty=mysql_query("UPDATE `percent` JOIN `time` USING(`name`) SET `percent`.`sum`=`percent`.`percent` +`time`.`time`");



# Table structure for table 'percent'

CREATE TABLE /*!32312 IF NOT EXISTS*/ `percent` (
  `name` varchar(255) default NULL,
  `percent` varchar(255) default NULL,
  `sum` varchar(255) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;

# Dumping data for table 'percent'

/*!40000 ALTER TABLE `percent` DISABLE KEYS*/;
LOCK TABLES `percent` WRITE;
REPLACE INTO `percent` (`name`, `percent`, `sum`) VALUES ('ronalex','0.35','35.35'),
    ('ronalex','0.8','35.8'),
    ('ronalex','10','45');
UNLOCK TABLES;
/*!40000 ALTER TABLE `percent` ENABLE KEYS*/;



# Table structure for table 'time'

CREATE TABLE /*!32312 IF NOT EXISTS*/ `time` (
  `name` varchar(255) default NULL,
  `time` varchar(255) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;

# Dumping data for table 'time'

/*!40000 ALTER TABLE `time` DISABLE KEYS*/;
LOCK TABLES `time` WRITE;
REPLACE INTO `time` (`name`, `time`) VALUES ('ronalex','35'),
    ('ronalex','2319'),
    ('ronalex','159');
UNLOCK TABLES;
/*!40000 ALTER TABLE `time` ENABLE KEYS*/;


В результате получается:

Таблица time
name,time
ronalex,35
ronalex,2319
ronalex,159

Таблица percent
name,percent,sum
ronalex,0.35,35.35
ronalex,0.8,35.8
ronalex,10,45

дак вот в таблице percent к последнему столбику прибавляется постоянно одно и тоже число это число 35, а надо 0.35+35, потом 0.8+2319, потом 10+159
а у меня постоянно происходит:
0.35+35, потом 0.8+35, потом 10+35

надеюсь, что объяснил более - менее понятнее, помогите пожалуйста

   
 
 автор: Trianon   (13.06.2007 в 22:08)   письмо автору
 
   для: ronalex   (13.06.2007 в 21:21)
 

по каким правилам строки первой таблицы соответствуют строкам второй таблицы?

   
 
 автор: ronalex   (13.06.2007 в 22:26)   письмо автору
 
   для: Trianon   (13.06.2007 в 22:08)
 

по name

   
 
 автор: Trianon   (13.06.2007 в 22:39)   письмо автору
 
   для: ronalex   (13.06.2007 в 22:26)
 

В Ваших данных столбец name не содержит уникальные значения.
Отличить по нему строки одну от другой невозможно.

   
 
 автор: ronalex   (14.06.2007 в 10:26)   письмо автору
 
   для: Trianon   (13.06.2007 в 22:39)
 

Подскажите пожалуйста, что делает этот скрипт, и куда нужно вводить данные в него чтобы он заработал

function build_insert( $dbname, $table_name, $array )
{
   $res = mysql_query("DESCRIBE ".$dbname.".".$table_name);

   $q = "INSERT INTO ".$dbname.".".$table_name." (";
   $q2 = "(";

   while( $row = mysql_fetch_array($res) )
   {
      $q .= $row['Field'] . ",";
      $q2 .= "'" . $array["{$row['Field']}"] . "'" . ",";
   }

   $q = substr($q, 0, -1);
   $q .= ")";
   $q .= " VALUES ";

   $q2 = substr($q2, 0, -1);
   $q2 .= ")";

   $q .= $q2;

   return $q;
}

   
 
 автор: Trianon   (14.06.2007 в 10:54)   письмо автору
 
   для: ronalex   (14.06.2007 в 10:26)
 

Это плохой скрипт. Он допускает SQL-инъекции и порождает лишние запросы к БД.


Лучше применяйте такой:
<?
function build_insert$table_name$array 

    
$sep '('$q1 "INSERT INTO `$table_name` "$q2 " ) VALUES "
    
foreach($array as $key =>$val)
    {  
        if(
is_string($val)) 
            
$val "'".mysql_escape_string($val)."'";
        
$q1 .= "$sep`$key`";
        
$q2 .= "$sep$val";
        
$sep ',';
    }
    return 
$q1 $q2 ')';
}


вызов
<?
$sql 
build_insert("percent", array('name' => 'user1''percent' => 0.8'sum' => 0));
mysql_query("$sql") or die("Error in $sql"mysql_error());

   
 
 автор: ronalex   (14.06.2007 в 13:45)   письмо автору
 
   для: Trianon   (14.06.2007 в 10:54)
 

Подскажите, как мне вытащить данные из 2х предыдущих таблиц одним запросом
и каким оператором воспользоваться

$e=mysql_query("SELECT * FROM `percent`, `time` WHERE name='".$_SESSION['user']."'");
while($y=mysql_fetch_array($e))
{
echo $y[percent]*2;
}

   
 
 автор: Trianon   (14.06.2007 в 13:57)   письмо автору
 
   для: ronalex   (14.06.2007 в 13:45)
 

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


Блин горелый...
Вы извините меня ради бога... но я в шоке.
Судя по данным, которыми Вы оперируете, Вы играете с деньгами.
И как я понимаю, довольно большими.
При этом достаточно простых вещей, вроде того, что числа нужно хранить в числовых полях БД, а пароли крайне желательно не выбалтывать в форумах, Вы не просекаете.
может быть стоит подрядить кого-нибудь на эту задачу?
Так ведь и попасть недолго....

   
Rambler's Top100
вверх

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