работа SUMM

slip

Guest
работа SUMM

мне нужно получить разницу table1.pole1 и table2.pole1 и сортировать по разным ID table2.pole1 . Собственно проблемма не в этом. Проблемма в чем если у table2.pole1 ВСЕГО 1 запись с нужным нам ID то все ОК, то есть структура:

table1.pole1 = 10
table2.pole1 = 10
SUM(table1.pole1-table2.pole1) результат = 0

НО, если в таблице много записей, то есть ID не одинединственный, а их много то получается каша, то есть если

table1.pole1 = 10
table2.pole1 = 5
table2.pole1 = 5
SUM(table1.pole1-table2.pole1) результат = НЕ НОЛЬ

Я подумал сделать так SUM(table1.pole1-(table2.pole1)) то есть получить сумму полей table2.pole1, но это тоже не выводит нужного результата, как быть? спасибо
 

alpine

Новичок
slip
Похоже что у тебя какая-то лажа со структурой таблиц.
Покажи:
[sql]
SHOW CREATE TABLE table1;
SHOW CREATE TABLE table2;
[/sql]
Покажи реальный запрос, а не обрывки. И что ты хочешь получить своим запросом? А то я так и не понял.
 

slip

Guest
Уууу..
--Table1
' zakaz' ,' CREATE TABLE `zakaz` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(15) NOT NULL default '',
`password` varchar(15) NOT NULL default '',
`izdelie` varchar(255) NOT NULL default '',
`category_izdelie` varchar(20) NOT NULL default '',
`more_data_izdelie` varchar(255) default NULL,
`koli_izdelii_zak_kl` smallint(7) NOT NULL default '0',
`date_oformlenya_zakaz` varchar(10) NOT NULL default '',
`cost_for_client` varchar(6) default NULL,
`firm_deliver` varchar(15) default NULL,
`coordin_firm_deliver` varchar(255) NOT NULL default '',
`cost_from_firm` float(6,2) default '0.00',
`date_zakaz_firma_post` varchar(10) default NULL,
`srok_zakaz_firm_post` varchar(17) default NULL,
`srok_zakaz_mi` varchar(17) default NULL,
`id_usersdata` int(11) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251'

table2

' sklad' ,' CREATE TABLE `sklad` (
`id_sklad` varchar(11) NOT NULL default '',
`kolvo` varchar(5) NOT NULL default '',
`datee` varchar(20) NOT NULL default '',
`id_s` int(11) NOT NULL auto_increment,
PRIMARY KEY (`id_s`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251'

а сам запрос звучит так:

SELECT zakaz.id, users_data.fio_client, zakaz.izdelie, zakaz.category_izdelie, zakaz.more_data_izdelie, zakaz.koli_izdelii_zak_kl, SUM(zakaz.koli_izdelii_zak_kl-sklad.kolvo) SUMM, SUM(sklad.kolvo) totalSklad
FROM zakaz INNER JOIN users_data ON zakaz.username = users_data.user
LEFT OUTER JOIN sklad ON sklad.id_sklad = zakaz.id
WHERE zakaz.{$sel} LIKE '%$what%'
AND users_data.type = 'user'
GROUP BY zakaz.id
HAVING SUMM > 0
 

alpine

Новичок
slip
Расскажи что ты хочешь получить этим запросом.

-~{}~ 17.07.05 19:03:

оказалось у тебя там еще и третья таблица приплелась ... :)
 

slip

Guest
Собственно сам запрос работает, не работает только эта часть. Им я хочу получить данные который забиты в SELECT, потом мне нужно объеденить все данные в двух таблицах, при этом если в одной из них не найдено совпадений показывать все равно другу таблицу, ну в этому еще добавить 3юю таболицу.:) потом результат работы SUM если меньше 0 то не выводить его. Примерно это в двух словах...
 

alpine

Новичок
slip
стоп! а если написать так:
Код:
SELECT 
 zakaz.id,
 users_data.fio_client,
 zakaz.izdelie,
 zakaz.category_izdelie,
 zakaz.more_data_izdelie,
 zakaz.koli_izdelii_zak_kl,
 (zakaz.koli_izdelii_zak_kl-SUM(sklad.kolvo)) SUMM,
 SUM(sklad.kolvo) totalSklad
FROM zakaz 
 INNER JOIN users_data
 ON zakaz.username = users_data.user 
 LEFT OUTER JOIN sklad
 ON sklad.id_sklad = zakaz.id 
WHERE zakaz.{$sel} LIKE '%$what%' 
 AND users_data.type = 'user'
GROUP BY
 zakaz.id
HAVING
 SUMM > 0
?
 

slip

Guest
Блин, не хватило мозгов на то что можно написать так....Работает, только более верный вариант будет такой:

$query = "SELECT zakaz.id, users_data.fio_client, zakaz.izdelie, zakaz.category_izdelie, zakaz.more_data_izdelie, zakaz.koli_izdelii_zak_kl, (zakaz.koli_izdelii_zak_kl - SUM(IFNULL(sklad.kolvo,0)))SUMM, SUM(sklad.kolvo) totalSklad
FROM zakaz
INNER JOIN users_data ON zakaz.username = users_data.user
LEFT OUTER JOIN sklad ON sklad.id_sklad = zakaz.id
WHERE zakaz.{$sel}
LIKE '%$what%' AND users_data.type = 'user'
GROUP BY zakaz.id
HAVING SUMM > 0

То есть что бы запрос по любому выводил запись нам нужно обработать его IFNULL.....

alpine спасибо тебе большое. =)
 

alpine

Новичок
slip
Слушай а у тебя мускуль какой?
а то это дело лучше бы вынести во вложенный запрос
[sql]
INNER JOIN users_data
ON zakaz.username = users_data.user
[/sql]

-~{}~ 17.07.05 20:05:

типа
[sql]
(SELECT fio_client FROM users_data WHERE users_data.user = zakaz.username) AS fio_client
[/sql]
 

slip

Guest
MySQL 4.1
А зачем выносить во вложенный запрос? что изменится?
 

alpine

Новичок
slip
Время выполнения запроса изменится если это тебе интересно.

-~{}~ 17.07.05 22:01:

Мне интересно что EXPLAIN покажет с объединением таблицы и с вложенным селектом, а тебе?
 

slip

Guest
Работает так же....а Explain..щас..

1,' PRIMARY' ,' zakaz' ,' ALL' ,' ' ,' ' , ,' ' , 2,' Using where; Using temporary; Using filesort'
1,' PRIMARY' ,' sklad' ,' ALL' ,' ' ,' ' , ,' ' , 4,' '
2,' DEPENDENT SUBQUERY' ,' users_data' ,' ALL' ,' ' ,' ' , ,' ' , 4,' Using where'

И на счет скорости...Я думаю что актуально когда у тебя ОЧЕНЬ ОЧЕНЬ большая БД, когда БД средних размеров парится на эту тему я думаю нет смысла...но может я не прав..
 

alpine

Новичок
slip
Это у тебя там колонка rows 2 и 4 ?

-~{}~ 17.07.05 22:39:

slip
понятно ...
 
Сверху