powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка из трех и более таблиц
25 сообщений из 34, страница 1 из 2
Выборка из трех и более таблиц
    #32118326
BigHarry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, пожалуйста, как решить проблему.
Имеется три таблицы.
tovar - таблица характеристик товаров
================
Kod - уникальный код товара
Name - название товара
================
sklad - таблица с товарами на складах
================
Kod - код товара
NumSkl - номер склада
kolvo - количество товара
================
mag - таблица с товарами в магазинах
================
Kod - код товара
NumMagl - номер магазина
kolvo - количество товара
================
Хочется в результате запроса получить такую сводную таблу:
========================================
| Товар | Кол-во склады | Кол-во магазины |
========================================
Какой должен быть запрос?
Я делаю такой:
=========================================
SELECT tovar.Kod, tovar.Name,
SUM(mag.Kolvo) AS KolMag,
SUM(sklad.Kolvo) AS KolSkl
FROM tovar, mag, sklad
WHERE (mag.Kod=tovar.Kod OR sklad.Kod=tovar.Kod)
GROUP BY tovar.Kod
=========================================
В результате - получается пустая выборка.
Если сделать запрос только по двум таблицам:
=========================================
SELECT tovar.Kod, tovar.Name,
SUM(mag.Kolvo) AS KolMag
FROM tovar, mag
WHERE mag.Kod=tovar.Kod
GROUP BY tovar.Kod
=========================================
То получается правильно - но, ессно, без данных по таблице склада.
Что можно сделать?
...
Рейтинг: 0 / 0
Выборка из трех и более таблиц
    #32118443
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объяснил отлично, но жаль без примера... Щас попробуя у себя повторить структуру таблиц с данными и напешу, что получилось. Но однозначно надо использовать LEFT JOIN.
...
Рейтинг: 0 / 0
Выборка из трех и более таблиц
    #32118475
BigHarry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробую с примером...
таблица tovar:
===========================
| Kod | Name |
-----------------------------------
1077 Чайник Скарлет-1022
5618 Утюг PHILIPS-78
3388 Телевизор Sony E-25
===========================
таблица sklad:
=====================
| Kod | NumSkl | Kolvo
---------------------------
1077 1 10
1077 2 5
5618 1 8
3388 1 3
=====================

таблица mag:
=====================
| Kod | NumMag | Kolvo
---------------------------
1077 10 3
1077 15 15
5618 10 10
1077 3 1
====================

В результате запроса хочется поиметь такую выборку:
===============================================
| Товар | Кол-во склады | Кол-во магазины |
===============================================
Телевизор Sony E-25 3 0
Чайник Скарлет-1022 15 19
Утюг PHILIPS-78 8 10
===============================================

Вот типа так...
...
Рейтинг: 0 / 0
Выборка из трех и более таблиц
    #32118519
Aninymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Плохо получилось - не наглядно, попробую иначе:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
таблица tovar:
========================
|  Kod  |  Name                          
 -------------------------------
 
   1077     Чайник Скарлет- 1022 
   5618     Утюг PHILIPS- 78 
   3388     Телевизор Sony E- 25 
========================
таблица sklad:
=====================
|  Kod  |  NumSkl   |  Kolvo
 ---------------------------
 
    1077        1               10 
    1077        2                5 
    5618        1                8 
    3388        1                3 
=====================

таблица mag:
=====================
|  Kod  |  NumMag   |  Kolvo
 ---------------------------
 
    1077        10                  3 
    1077        15                15 
    5618        10                10 
    1077          3                  1 
====================

В результате запроса хочется поиметь такую выборку:
=============================================== 
| Товар                      | Кол-во склады | Кол-во магазины | 
=============================================== 
Телевизор Sony E- 25                  3                        0 
Чайник Скарлет- 1022                 15                      19 
Утюг PHILIPS- 78                          8                       10 
=============================================== 
...
Рейтинг: 0 / 0
Выборка из трех и более таблиц
    #32118544
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну пример данных желательно оформлять так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
CREATE DATABASE shop;

USE shop;

CREATE TABLE mag (
  Kod BIGINT( 20 ),
  NumMag BIGINT( 20 ),
  Kolvo DOUBLE( 15 , 3 )
);

CREATE TABLE sklad (
  Kod BIGINT( 20 ),
  NumSkl BIGINT( 20 ),
  Kolvo DOUBLE( 15 , 3 )
);

CREATE TABLE tovar (
  Kod BIGINT( 20 ),
  Name VARCHAR( 255 )
);

INSERT INTO tovar VALUES ( 1077 , 'Чайник Скарлет-1022');
INSERT INTO tovar VALUES ( 5618 , 'Утюг PHILIPS-78');
INSERT INTO tovar VALUES ( 3388 , 'Телевизор Sony E-25');

INSERT INTO sklad VALUES ( 1077 ,  1 ,  10 );
INSERT INTO sklad VALUES ( 1077 ,  2 ,  5 );
INSERT INTO sklad VALUES ( 5618 ,  1 ,  8 );
INSERT INTO sklad VALUES ( 3388 ,  1 ,  3 );

INSERT INTO mag VALUES ( 1077 ,  10 ,  3 );
INSERT INTO mag VALUES ( 1077 ,  15 ,  15 );
INSERT INTO mag VALUES ( 5618 ,  10 ,  10 );
INSERT INTO mag VALUES ( 1077 ,  3 ,  1 );


А без UNION (только с MySQL 4.00) твою задачку сложно решить. Проще всего через временную таблицу.
...
Рейтинг: 0 / 0
Выборка из трех и более таблиц
    #32118549
BigHarry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за науку, только как через временную таблицу ?
Какой должен быть запрос?
...
Рейтинг: 0 / 0
Выборка из трех и более таблиц
    #32118555
medved
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SELECT
tovar.Kod,
tovar.Name,
SUM(mag.Kolvo) AS KolMag,
SUM(mag.Kolvo) AS KolSkl
FROM
tovar
left join
mag
on
mag.Kod=tovar.Kod
left join
sklad
on
sklad.Kod=tovar.Kod
GROUP BY tovar.Kod
...
Рейтинг: 0 / 0
Выборка из трех и более таблиц
    #32118563
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2medved, а ты пробовал! :)

Код: plaintext
1.
2.
3.
4.
Kod	Name	KolMag	KolSkl
 1077 	Чайник Скарлет- 1022 	 38 . 000 	 45 . 000 
 3388 	Телевизор Sony E- 25 	 0 . 000 	 3 . 000 
 5618 	Утюг PHILIPS- 78 	 10 . 000 	 8 . 000 
...
Рейтинг: 0 / 0
Выборка из трех и более таблиц
    #32118597
BigHarry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я попробовал - действительно - с левым Джоном количество по складам (KolSkl) получается неправильным - удвояется.
Придется, видать, через темпоральную табу...
А имена темпоральных таблиц должны быть уникальными, или нет? Ведь может получится так, что два чела одновременно запустят один и тот же скрипт - и случится какой-нить неприятный ошибон из-за совпадения имен таблиц...
Хотя - где-то вроде проскакивало - что темпоральные таблы уникальны и видны только в своей сессии...
...
Рейтинг: 0 / 0
Выборка из трех и более таблиц
    #32118633
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
C временной таблицей так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DROP TABLE zz;

CREATE TEMPORARY TABLE zz(tovar_kod bigint, tovar_name varchar( 255 ), sklad_kolvo double, mag_kolvo double);

INSERT INTO zz
SELECT a.kod as tovar_kod, left(a.name, 25 ) as tovar_name, b.kolvo as sklad_kolvo,  0  as mag_kolvo
FROM tovar a LEFT JOIN sklad b ON a.kod=b.kod;

INSERT INTO zz
SELECT a.kod as tovar_kod, left(a.name, 25 ) as tovar_name,  0  as sklad_kolvo, c.kolvo as mag_kolvo
FROM tovar a LEFT JOIN mag c ON a.kod=c.kod;

SELECT zz.tovar_kod, zz.tovar_name, sum(zz.sklad_kolvo), sum(zz.mag_kolvo)
FROM zz
GROUP BY zz.tovar_kod, zz.tovar_name;
...
Рейтинг: 0 / 0
Выборка из трех и более таблиц
    #32119038
BigHarry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cпасибо большое всем, кто мне помогал !!!
У меня получилося, только немного по-другому - через две темпоральные таблицы (мне так более понятнее).
Получилось вот что:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TEMPORARY TABLE magtmp (Kod VARCHAR( 4 ), Kolvo SMALLINT( 3 ));
INSERT INTO magtmp SELECT Kod, SUM(Kolvo) FROM mag GROUP BY Kod;

CREATE TEMPORARY TABLE skladtmp (Kod VARCHAR( 4 ), Kolvo SMALLINT( 3 ));
INSERT INTO skladtmp SELECT Kod, SUM(Kolvo) FROM sklad GROUP BY Kod;


SELECT tovar.Name, magtmp.Kolvo AS KolMag, skladtmp.Kolvo AS KolSklad
FROM tovar
left join magtmp on magtmp.Kod=tovar.Kod
left join skladtmp on skladtmp.Kod=tovar.Kod
GROUP BY tovar.Kod
HAVING (KolMag> 0  or KolSklad> 0 )
...
Рейтинг: 0 / 0
Выборка из трех и более таблиц
    #32119097
BigHarry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заодно вопрос другого плана.
Мне кажется - темпоральные таблицы должны иметь уникальные имена, так как запросы к базе выполняются интерпретатором PHP, который при подключении к Мускулю использует процедуру mysql_pconnect - таким образом все сессии используют одно подключение к базе и экономятся ресурсы. Если темпоральные базы будут иметь одно имя - то скорей всего возможна коллизия при одновременном выполнении запроса разными сессиями.
Это так?
...
Рейтинг: 0 / 0
Выборка из трех и более таблиц
    #32119121
medved
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT 
	tovar.Kod, 
	tovar.Name, 
	SUM(mag.Kolvo)/(count(mag.Kolvo)/count(distinct mag.Kolvo)) AS KolMag, 
	SUM(sklad.Kolvo)/(count(sklad.Kolvo)/count(distinct sklad.Kolvo)) AS KolSkl
FROM 
	tovar 
left join 
					mag 
				on 
					mag.Kod=tovar.Kod 
left join 
					sklad 
				on 
					sklad.Kod=tovar.Kod 
group by tovar.Kod
order by tovar.Kod
...
Рейтинг: 0 / 0
Выборка из трех и более таблиц
    #32119174
BigHarry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вах !!!
Сработало - даже без темпоральных таблиц !!!
...
Рейтинг: 0 / 0
Выборка из трех и более таблиц
    #32119201
medved
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю что если RFTM про JOIN, то мона легче - мне рыться ломает. Да и потести а то меня и думать ломало над вопросами что если так и вот так
...
Рейтинг: 0 / 0
Выборка из трех и более таблиц
    #32119246
BigHarry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо - обязательно потестю...
Ну ежели чо не так - откачу на темпоралы...
...
Рейтинг: 0 / 0
Выборка из трех и более таблиц
    #32119274
medved
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше напиши я исправлю...
...
Рейтинг: 0 / 0
Выборка из трех и более таблиц
    #32119762
plankton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ребята, сорри я тут невольно подслушал ваш разговор. :) А мне не поможете? я начинающий и по-этому не очень понял все ваши объяснения... но у меня видимо такая же проблема.
вообщем я раскажу что надо сделать мне, а если у вас будет возможность помогите пожалуйста.
Вообщем задание в принципе у меня такое:

Надо найти кол-во рейсов по понедельникам, которые обслуживали больше 2 сотрудников с зарплатой больше 1000р.
(Это похоже на лабу т.к. это и есть она, просто одну половинку сделал, осталась вот эта, а не понимаю просто как сделать)...

Вот теперь по таблицам, у меня всего 5 таблиц, но видимо придётся выбирать из 3-х таблиц.... вот что они содержат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
reis (таблица рейсов, тут связана DAYRISE(день недели) и IDREIS) 
 ---------------------------------------------
 
|  IDREIS  |  DATA   |  TIMERISE  |  DAYRISE |
 ---------------------------------------------
 
|    102      |  10 . 02 . 02 |  12 : 00         |       1        |
|    103      |  11 . 02 . 02 |  12 : 00         |       1        |
|    104      |  12 . 02 . 02 |  12 : 00         |       4        |
|    105      |  14 . 02 . 02 |  12 : 00         |       1        |
 ---------------------------------------------
 

fly  (таблица самолётов, тут связаны IDREIS и ID)
 --------------------------------------------
 
|FLYNAME| PODEM   | PASS  |  ID  | IDREIS |
 --------------------------------------------
 
|   loop1  |     10       |   12      |   1    |     102   |
|   loop2  |     10       |   12      |   2    |     103   |
|   loop3  |     10       |   12      |   3    |     104   |
|   loop4  |     10       |   12      |   4    |     105   |
 --------------------------------------------
 

sotrudnik (таблица где связана ID и зарплата)
 ------------------------------------------------
 
|ID| Name  | MN| Last  |  post | zarplata | data |
 ------------------------------------------------
 
| 1  | Jhon   |  K  | Doe  |  pilot  |    1002    |  15 . 02 
| 2  | Jhon   |  L  | Doe  |  pilot  |    1003    |  16 . 02 
| 3  | Jhon   |  M | Doe  |  pilot  |    1006    |  17 . 02 
| 4  | Jhon   |  N  | Doe  |  pilot  |    1005    |  18 . 02 
 --------------------------------------------
 


как сдела, помогите пожалуйста...
...
Рейтинг: 0 / 0
Выборка из трех и более таблиц
    #32119948
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2medved, а ты хитрый...

2plankton, а чем у тебя привязываются сотрудники к рейсам? Нет зависимости!
...
Рейтинг: 0 / 0
Выборка из трех и более таблиц
    #32119961
BigHarry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Они привязываются через поле ID в таблице флай.
Тлько пример не очень наглядный - согласно этой таблице - выходит что один рейс обслуживает только один чел.
...
Рейтинг: 0 / 0
Выборка из трех и более таблиц
    #32120030
plankton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2mahoune: там есть через таблицу FLY. по-этому получается мне надо делать выборку из 3-х таблиц.

2BigHarry: Сорри наверное не правильно написал. я просто сам не могу полностью понять задание.. :( бошка начинает разрываться. :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
fly  (таблица самолётов, тут связаны IDREIS и ID)
 --------------------------------------------
 
|FLYNAME| PODEM   | PASS  |  ID  | IDREIS |
 --------------------------------------------
 
|   loop1  |     10       |   12      |   1    |     102   |
|   loop2  |     10       |   12      |   1    |     103   |
|   loop3  |     10       |   12      |   3    |     104   |
|   loop4  |     10       |   12      |   1    |     105   |
 --------------------------------------------
 
...
Рейтинг: 0 / 0
Выборка из трех и более таблиц
    #32120417
BigHarry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я хочу вернуться к своему вопросу.
Запрос должен быть немного сложнее, чем я ожидал, но думаю вы поймете...
Сделать надо типа такой запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT tovar.Kod, tovar.Name,
SUM(mag.Kolvo)/(count(mag.Kolvo)/count(distinct mag.Kolvo)) AS KolMag,
SUM(sklad.Kolvo)/(count(sklad.Kolvo)/count(distinct sklad.Kolvo)) AS KolSkl
SUM(sklad.Kolvo)/(count(sklad.Kolvo)/count(distinct sklad.Kolvo)) AS KolSkl2
FROM tovar 
LEFT JOIN mag ON mag.Kod=tovar.Kod 
LEFT JOIN sklad ON (sklad.Kod=tovar.Kod AND sklad.Num= 1 )
LEFT JOIN sklad ON (sklad.Kod=tovar.Kod AND sklad.Num= 2 )
GROUP BY tovar.Kod


Т.е. из таблицы склад надо реально вычипить две колонки (по условию), а не одну.
Мускуль такой запрос не принимает - ошибку выдает. Может - можно что-то подкрутить?
...
Рейтинг: 0 / 0
Выборка из трех и более таблиц
    #32120461
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT tovar.Kod, tovar.Name,
SUM(mag.Kolvo)/(count(mag.Kolvo)/count(distinct mag.Kolvo)) AS KolMag,
SUM(a.Kolvo)/(count(a.Kolvo)/count(distinct a.Kolvo)) AS KolSkl,
SUM(d.Kolvo)/(count(d.Kolvo)/count(distinct d.Kolvo)) AS KolSkl2
FROM tovar
LEFT JOIN mag ON mag.Kod=tovar.Kod
LEFT JOIN sklad a ON (a.Kod=tovar.Kod AND a.NumSkl= 1 )
LEFT JOIN sklad d ON (a.Kod=tovar.Kod AND d.NumSkl= 2 )
GROUP BY tovar.Kod
...
Рейтинг: 0 / 0
Выборка из трех и более таблиц
    #32120628
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to BigHarry
Код: plaintext
1.
2.
3.
запросы к базе выполняются интерпретатором PHP, который при
подключении к Мускулю использует процедуру mysql_pconnect - таким 
образом все сессии используют одно подключение к базе и экономятся
 ресурсы. 

А вот этого лучше не делать, потому как получишь обратное - нерациональноен расходование этих самым ресурсов. pconnect() работает некорректно (по крайней мере не так как пишут в мануале) - он может тебе вернуть старое соединение, а может и открыть новое, старые же остаются висеть до перезагрузки сервера. Попробуй погонять скрипт с pconnect() и потом посмотри сколько у тебя соединений к БД открыто...
Лучше обычный connect().. не так уж и много времени уходит на соединение.
...
Рейтинг: 0 / 0
Выборка из трех и более таблиц
    #32120943
BigHarry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да - по поводу p_connect - я уже напоролся на грабли - соединения не закрываются по истечении всевозможных таймаутов (лог Мускуля), каждый вызов порождает новое соединение, и довольно часто происходит облом при попытке соединения через этот гребаный p_connect. Прищлось от него отказаться.
Спасибо ОГРОМНОЕ всем, кто помог сделать хитрый запросец !!!
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка из трех и более таблиц
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]