|
|
|
| Имеются две таблицы, как произвести между ними операции (Умножение/деление/вычитание/сложение) по столбикам sum
две таблицы объединяет имя пользователя:
Табица№1
name sum
-------- ------
user1 100
user2 200
Табица№2
name sum
-------- ------
user1 111
user2 222 | |
|
|
|
|
|
|
|
для: ronalex
(09.06.2007 в 20:08)
| | name - первичный ключ?
tab1 += tab2:
UPDATE tab1
JOIN tab2 USING(name)
SET `tab1.sum`=`tab1.sum` +`tab2.sum`
|
остальные аналогично | |
|
|
|
|
|
|
|
для: Trianon
(09.06.2007 в 20:21)
| | так пробовал и неполучилось, в чём может быть проблема, пожалуйста подскажите | |
|
|
|
|
|
|
|
для: ronalex
(09.06.2007 в 20:56)
| | откликнитесь, пожалуйста
name не ключ, а просто значение | |
|
|
|
|
|
|
|
для: ronalex
(13.06.2007 в 08:55)
| | приводите структуры таблиц. А лучше фрагмент дампа структуры и данных, на которых рушится запрос.
Показывайте, как соединяются строки в этих таблицах. | |
|
|
|
|
|
|
|
для: 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`");
|
| |
|
|
|
|
|
|
|
для: ronalex
(13.06.2007 в 09:59)
| | Попробуйте вот такой запрос:
$qwerty=mysql_query("UPDATE `percent` JOIN `time` USING(`name`) SET `percent`.`sum`=`percent`.`percent` +`time`.`time`");
|
Заработает.
Кроме того, структура таблицы не соответствует хранимым в ней данным.
Для хранения арифметических величин должны использоваться числовые, а не текстовые поля.
Соединяемые таблицы должны быть снабжены первичным и чужим ключами.
И индексами, построенными на этих ключах. | |
|
|
|
|
|
|
|
для: Trianon
(13.06.2007 в 10:16)
| | ОГРОМНОЕ СПАСИБО!, всё заработало | |
|
|
|
|
|
|
|
для: Trianon
(13.06.2007 в 10:16)
| | Уважаемый Trianon, Работает, только при таком запросе вносится в таблицу только первое значение, а их много, как мне передать все значения массиву и их помножить?
нужно умножить слолбик на столбик, а получается что умножается первое значение на весь другой столбик | |
|
|
|
|
|
|
|
для: ronalex
(13.06.2007 в 19:10)
| | у меня изменяются все три строки.
Приводите пример. | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: ronalex
(13.06.2007 в 19:33)
| | показывайте дамп исходных данных. | |
|
|
|
|
|
|
|
для: 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`");
?>
|
| |
|
|
|
|
|
|
|
для: ronalex
(13.06.2007 в 19:38)
| | В том же самом, как Вы выражаетесь, дампе, в строках не различаются имена пользователей.
и они всяко не равны тому, что Вы написали в примере | |
|
|
|
|
|
|
|
для: Trianon
(13.06.2007 в 19:42)
| | это я просто для примера написал про две таблицы, мне главно суть уловить, можно ли как -нибудь передать данные из бд массиву, чтобы ими потом было легко управлять | |
|
|
|
|
|
|
|
для: 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
надеюсь, что объяснил более - менее понятнее, помогите пожалуйста | |
|
|
|
|
|
|
|
для: ronalex
(13.06.2007 в 21:21)
| | по каким правилам строки первой таблицы соответствуют строкам второй таблицы? | |
|
|
|
|
|
|
|
для: Trianon
(13.06.2007 в 22:08)
| | по name | |
|
|
|
|
|
|
|
для: ronalex
(13.06.2007 в 22:26)
| | В Ваших данных столбец name не содержит уникальные значения.
Отличить по нему строки одну от другой невозможно. | |
|
|
|
|
|
|
|
для: 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;
}
|
| |
|
|
|
|
|
|
|
для: 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());
|
| |
|
|
|
|
|
|
|
для: 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;
}
|
| |
|
|
|
|
|
|
|
для: ronalex
(14.06.2007 в 13:45)
| | из двух таблиц, несвязанных друг с другом (а Вы вторые сутки не можете показать, как они связываются - мы по-моему уже на четвертый круг пошли) данные достают двумя независимыми запросами.
Заведите чтоли новую тему...
Блин горелый...
Вы извините меня ради бога... но я в шоке.
Судя по данным, которыми Вы оперируете, Вы играете с деньгами.
И как я понимаю, довольно большими.
При этом достаточно простых вещей, вроде того, что числа нужно хранить в числовых полях БД, а пароли крайне желательно не выбалтывать в форумах, Вы не просекаете.
может быть стоит подрядить кого-нибудь на эту задачу?
Так ведь и попасть недолго.... | |
|
|
|
|