Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выборка с подсчетом из 2х таблиц 
:(
    Опции темы
DeaDMonaX
Дата 6.10.2012, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Господа, помогите плз реализовать

Есть 2 таблицы - объектов и их перевозок
Нужно вытянуть сумму ставок перевозок каждого объекта, при этом учитывая кол-во объектов в перевозке, и учитывая, что объект мог попасть в другую перевозку в виде дочернего.

Описание полей таблицы pr_transfers:
rate - ставка
wids_num - кол-во объектов в перевозке
wid - ид основного объекта
add_wids - дочерние объекты, в виде ид1,ид2,ид3...

ps_ws
uid - ид юзера, за которым закреплен объект
wid - ид объекта

Код
SELECT SUM(pr_transfers.rate/pr_transfers.wids_num) as sum,pr_transfers.wid, pr_ws.uid FROM pr_transfers,pr_ws WHERE (pr_ws.wid = pr_transfers.wid OR pr_transfers.add_wids LIKE CONCAT('%', pr_ws.wid)) GROUP BY pr_transfers.wid;

считается неправильно..


Использую MariaDB, таблицы Aria



PM MAIL WWW ICQ   Вверх
Akina
Дата 6.10.2012, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

Репутация: 45
Всего: 454



Малопонятное объяснение...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
DeaDMonaX
Дата 6.10.2012, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Akina, поконкретнее, что непонятно?

Вытягиваем иды объектов из таблицы объектов и получаем сумму поля rate всех записей, деленного на поле wids_num в таблице рейсов, где либо иды объекта совпадают с текущим, либо наш текущий ид присутствует в спец. поле дочерних объектов.

Код

CREATE TABLE `pr_transfers` (
  `tid` int(11) NOT NULL auto_increment,
  `wid` int(8) NOT NULL,
  `rate` tinytext,
  `add_wids` tinytext,
  `wids_num` tinyint(4) unsigned default '1',
  `uid` varchar(64) NOT NULL,
  PRIMARY KEY  (`tid`),
  UNIQUE KEY `tid` (`tid`),
) ENGINE=MyISAM AUTO_INCREMENT=4724 DEFAULT CHARSET=cp1251;

CREATE TABLE `pr_ws` (
  `wid` int(8) NOT NULL,
  `uid` varchar(64) NOT NULL,
  PRIMARY KEY  (`wid`),
  UNIQUE KEY `wid` (`wid`),
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;


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

Это сообщение отредактировал(а) DeaDMonaX - 6.10.2012, 22:25
PM MAIL WWW ICQ   Вверх
Zloxa
Дата 7.10.2012, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

Репутация: 53
Всего: 161



Цитата(DeaDMonaX @  6.10.2012,  23:24 Найти цитируемый пост)
Вытягиваем иды объектов из таблицы объектов и получаем сумму поля rate всех записей, деленного на поле wids_num в таблице рейсов, где либо иды объекта совпадают с текущим, либо наш текущий ид присутствует в спец. поле дочерних объектов.

дословно преевожу на SQL

Код

select (select sum(rate) from объекты where фиг знает какой критерий объединения)/рейсы.winds_num
from таблица_рейсов as рейсы
wherе иды_обекта = текущий or наш_текущий_ид = спец_поле_дочерих_cукa_объектов


Это сообщение отредактировал(а) Zloxa - 7.10.2012, 00:30


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
DeaDMonaX
Дата 7.10.2012, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Zloxa, rate каждой записи до суммирования должен делиться на wids_num... идею твою немного понял, но не совсем

т.е. если объектов в перевозке больше одного, то ставка должна размазаться поровну между ними

Это сообщение отредактировал(а) DeaDMonaX - 7.10.2012, 01:30
PM MAIL WWW ICQ   Вверх
Zloxa
Дата 7.10.2012, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

Репутация: 53
Всего: 161



Цитата(DeaDMonaX @  7.10.2012,  02:27 Найти цитируемый пост)
идею твою немного понял, но не совсем

Там не было идеи. Я вам ответил точно так же, как вы задали вопрос. Покуда вы нелепо формулируете вы будете получать нелепые ответы.

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

Добавлено через 5 минут и 11 секунд
Еще, правда, есть вариант, таки дождаться телепатов. Иногда, должен, признать, они сюда заходят. smile

Это сообщение отредактировал(а) Zloxa - 7.10.2012, 07:53


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
DeaDMonaX
Дата 7.10.2012, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Zloxa, 
pr_transfers
Код

tid    wid          rate           add_wids                      wids_num
7    52516721      85000.00                                       1
9    52518107      120000           52134236,52131810            3
17   52134236     43000.00                                        1
18   52648623     90000             52518107                      2
19   52518107     31309.74                                        1


pr_ws
Код

wid               uid
52516721    user1
52518107    user1
52134236    user2
52648623    user1
52131810    user1


ожидаемый результат
Код

wid                sum                            
52516721    85000.00                   (rate/wids_num из 7 рейса)         
52518107    120000/3 + 90000/2 + 31309,74 = 116309,7           (rate/wids_num из 9,18,19 рейсов)
52134236    43000 + 120000/3 = 83000              (rate/wids_num из 9,17 рейсов)              
52648623    90000/2 = 45000                 (rate/wids_num из 18 рейса)           
52131810    120000/3 = 40000              (rate/wids_num из 9 рейса)
                            


Это сообщение отредактировал(а) DeaDMonaX - 7.10.2012, 13:23
PM MAIL WWW ICQ   Вверх
tzirechnoy
Дата 7.10.2012, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата
LIKE CONCAT('%', pr_ws.wid))


Это все строки, которые заканчиваются на pr_ws.wid. Несколько не то, что нужно, действительно.


PM MAIL   Вверх
Zloxa
Дата 7.10.2012, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

Репутация: 53
Всего: 161



Код

select pr_ws.wid, sum(pr_transfers.rate/pr_transfers.wids_num )
/*left */ join pr_transfers using (wid)
from pr_ws
group by pr_ws.wid


Код

select pr_ws.wid, (select sum(pr_transfers.rate/pr_transfers.wids_num ) from pr_transfers where pr_transfers.wid = pr_transfers.pr_ws)
from pr_ws



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
DeaDMonaX
Дата 8.10.2012, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



итого что получилось:

Код
SELECT pr_ws.wid,SUM(pr_transfers.rate/pr_transfers.wids_num) as sum, pr_ws.uid FROM pr_ws
LEFT JOIN pr_transfers ON (pr_ws.wid = pr_transfers.wid OR pr_transfers.add_wids LIKE CONCAT('%',pr_ws.wid,'%')) GROUP BY pr_ws.wid;


Это сообщение отредактировал(а) DeaDMonaX - 8.10.2012, 21:19
PM MAIL WWW ICQ   Вверх
Zloxa
Дата 8.10.2012, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

Репутация: 53
Всего: 161



ясно... add_wids smile 
Код

SQL> with pr_transfers (tid,wid,rate,add_wids,wids_num)as (
  2    select 7,    52516721,      85000.00,null,                                       1 from dual
  3    union all select 9,    52518107,      120000           ,'52134236,52131810',     3 from dual
  4    union all select 17,   52134236,     43000.00          , null              ,     1 from dual
  5    union all select 18,   52648623,     90000             ,'52518107'         ,     2 from dual
  6    union all select 19,   52518107,     31309.74          , null              ,     1 from dual
  7  )
  8   ,pr_ws (wid, "uid") as (
  9     select 52516721    ,'user1' from dual
 10     union all select 52518107    ,'user1' from dual
 11     union all select 52134236    ,'user2' from dual
 12     union all select 52648623    ,'user1' from dual
 13     union all select 52131810    ,'user1' from dual
 14    )
 15  select pr_ws.*
 16         ,(select sum(pr_transfers.rate/pr_transfers.wids_num )
 17             from pr_transfers
 18             where pr_transfers.wid = pr_ws.wid
 19               or ','||add_wids||',' like '%,'||pr_ws.wid||',%'
 20           ) sum
 21  from pr_ws
 22  /
 
       WID uid          SUM
---------- ----- ----------
  52516721 user1      85000
  52518107 user1  116309.74
  52134236 user2      83000
  52648623 user1      45000
  52131810 user1      40000
 


Добавлено через 42 секунды
Цитата(Zloxa @  8.10.2012,  22:04 Найти цитируемый пост)
||

Это конкатенация есличо


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
DeaDMonaX
Дата 8.10.2012, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Zloxa, c джойном покруче получилось как-то (см. мое отредактированное сообщение)

всем спасибо, да!

Это сообщение отредактировал(а) DeaDMonaX - 8.10.2012, 21:21
PM MAIL WWW ICQ   Вверх
Zloxa
Дата 9.10.2012, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

Репутация: 53
Всего: 161



Цитата(DeaDMonaX @  8.10.2012,  21:06 Найти цитируемый пост)
LIKE CONCAT('%',pr_ws.wid,'%'))

У тебя строго восемь символов на ID? Оберни запятыми для надеги. Этот паттерн сматчит 12345 в (123456,1234567)




--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
DeaDMonaX
Дата 14.10.2012, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Zloxa, матчиться будет в любом случае 8 символов, поэтому не требуется) Ситуация 
Цитата
сматчит 12345 в (123456,1234567)
, в принципе, невозможна smile
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




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


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

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