|
Выборка из трех и более таблиц
|
|||
---|---|---|---|
#18+
Подскажите, пожалуйста, как решить проблему. Имеется три таблицы. 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 ========================================= То получается правильно - но, ессно, без данных по таблице склада. Что можно сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2003, 14:23 |
|
Выборка из трех и более таблиц
|
|||
---|---|---|---|
#18+
Объяснил отлично, но жаль без примера... Щас попробуя у себя повторить структуру таблиц с данными и напешу, что получилось. Но однозначно надо использовать LEFT JOIN. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2003, 15:31 |
|
Выборка из трех и более таблиц
|
|||
---|---|---|---|
#18+
Попробую с примером... таблица 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 =============================================== Вот типа так... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2003, 15:49 |
|
Выборка из трех и более таблиц
|
|||
---|---|---|---|
#18+
Плохо получилось - не наглядно, попробую иначе: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2003, 16:12 |
|
Выборка из трех и более таблиц
|
|||
---|---|---|---|
#18+
Ну пример данных желательно оформлять так: Код: 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.
А без UNION (только с MySQL 4.00) твою задачку сложно решить. Проще всего через временную таблицу. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2003, 16:42 |
|
Выборка из трех и более таблиц
|
|||
---|---|---|---|
#18+
Спасибо за науку, только как через временную таблицу ? Какой должен быть запрос? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2003, 16:45 |
|
Выборка из трех и более таблиц
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2003, 16:48 |
|
Выборка из трех и более таблиц
|
|||
---|---|---|---|
#18+
2medved, а ты пробовал! :) Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2003, 16:50 |
|
Выборка из трех и более таблиц
|
|||
---|---|---|---|
#18+
Я попробовал - действительно - с левым Джоном количество по складам (KolSkl) получается неправильным - удвояется. Придется, видать, через темпоральную табу... А имена темпоральных таблиц должны быть уникальными, или нет? Ведь может получится так, что два чела одновременно запустят один и тот же скрипт - и случится какой-нить неприятный ошибон из-за совпадения имен таблиц... Хотя - где-то вроде проскакивало - что темпоральные таблы уникальны и видны только в своей сессии... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2003, 17:08 |
|
Выборка из трех и более таблиц
|
|||
---|---|---|---|
#18+
C временной таблицей так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2003, 17:23 |
|
Выборка из трех и более таблиц
|
|||
---|---|---|---|
#18+
Cпасибо большое всем, кто мне помогал !!! У меня получилося, только немного по-другому - через две темпоральные таблицы (мне так более понятнее). Получилось вот что: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2003, 11:16 |
|
Выборка из трех и более таблиц
|
|||
---|---|---|---|
#18+
Заодно вопрос другого плана. Мне кажется - темпоральные таблицы должны иметь уникальные имена, так как запросы к базе выполняются интерпретатором PHP, который при подключении к Мускулю использует процедуру mysql_pconnect - таким образом все сессии используют одно подключение к базе и экономятся ресурсы. Если темпоральные базы будут иметь одно имя - то скорей всего возможна коллизия при одновременном выполнении запроса разными сессиями. Это так? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2003, 11:46 |
|
Выборка из трех и более таблиц
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2003, 11:59 |
|
Выборка из трех и более таблиц
|
|||
---|---|---|---|
#18+
Вах !!! Сработало - даже без темпоральных таблиц !!! ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2003, 12:26 |
|
Выборка из трех и более таблиц
|
|||
---|---|---|---|
#18+
Я думаю что если RFTM про JOIN, то мона легче - мне рыться ломает. Да и потести а то меня и думать ломало над вопросами что если так и вот так ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2003, 12:44 |
|
Выборка из трех и более таблиц
|
|||
---|---|---|---|
#18+
Спасибо - обязательно потестю... Ну ежели чо не так - откачу на темпоралы... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2003, 13:07 |
|
Выборка из трех и более таблиц
|
|||
---|---|---|---|
#18+
Лучше напиши я исправлю... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2003, 13:20 |
|
Выборка из трех и более таблиц
|
|||
---|---|---|---|
#18+
ребята, сорри я тут невольно подслушал ваш разговор. :) А мне не поможете? я начинающий и по-этому не очень понял все ваши объяснения... но у меня видимо такая же проблема. вообщем я раскажу что надо сделать мне, а если у вас будет возможность помогите пожалуйста. Вообщем задание в принципе у меня такое: Надо найти кол-во рейсов по понедельникам, которые обслуживали больше 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.
как сдела, помогите пожалуйста... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2003, 00:42 |
|
Выборка из трех и более таблиц
|
|||
---|---|---|---|
#18+
2medved, а ты хитрый... 2plankton, а чем у тебя привязываются сотрудники к рейсам? Нет зависимости! ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2003, 11:00 |
|
Выборка из трех и более таблиц
|
|||
---|---|---|---|
#18+
Они привязываются через поле ID в таблице флай. Тлько пример не очень наглядный - согласно этой таблице - выходит что один рейс обслуживает только один чел. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2003, 11:17 |
|
Выборка из трех и более таблиц
|
|||
---|---|---|---|
#18+
2mahoune: там есть через таблицу FLY. по-этому получается мне надо делать выборку из 3-х таблиц. 2BigHarry: Сорри наверное не правильно написал. я просто сам не могу полностью понять задание.. :( бошка начинает разрываться. :) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2003, 12:18 |
|
Выборка из трех и более таблиц
|
|||
---|---|---|---|
#18+
Я хочу вернуться к своему вопросу. Запрос должен быть немного сложнее, чем я ожидал, но думаю вы поймете... Сделать надо типа такой запрос: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Т.е. из таблицы склад надо реально вычипить две колонки (по условию), а не одну. Мускуль такой запрос не принимает - ошибку выдает. Может - можно что-то подкрутить? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2003, 17:01 |
|
Выборка из трех и более таблиц
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2003, 17:47 |
|
Выборка из трех и более таблиц
|
|||
---|---|---|---|
#18+
to BigHarry Код: plaintext 1. 2. 3.
А вот этого лучше не делать, потому как получишь обратное - нерациональноен расходование этих самым ресурсов. pconnect() работает некорректно (по крайней мере не так как пишут в мануале) - он может тебе вернуть старое соединение, а может и открыть новое, старые же остаются висеть до перезагрузки сервера. Попробуй погонять скрипт с pconnect() и потом посмотри сколько у тебя соединений к БД открыто... Лучше обычный connect().. не так уж и много времени уходит на соединение. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2003, 12:44 |
|
Выборка из трех и более таблиц
|
|||
---|---|---|---|
#18+
Да - по поводу p_connect - я уже напоролся на грабли - соединения не закрываются по истечении всевозможных таймаутов (лог Мускуля), каждый вызов порождает новое соединение, и довольно часто происходит облом при попытке соединения через этот гребаный p_connect. Прищлось от него отказаться. Спасибо ОГРОМНОЕ всем, кто помог сделать хитрый запросец !!! ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2003, 10:54 |
|
|
start [/forum/topic.php?fid=47&msg=32118549&tid=1856086]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
131ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 242ms |
0 / 0 |