Обединяване на таблици
11 отговора
0 прегледа
Обединяване на таблици
Здравейте,
имам следният въпрос към вас с молба за помощ. Трябва да обединя множество таблици около 300 да кажем с по 3 реда всяка.При обединяването MySQL би трябвало да направи някъде около 3 на степен 300 комбинации.Първият въпрос ми е дали подобно нещо е реално да се извърши или ще забие компа?
Вторият ми въпрос е:Да кажем че успее да направи всичките комбинации на мен ще ми трябват само някои от тях.Ето един пример с 2 таблици като този принцип трябва да се отнася за комбинация от 300 например
Таблица 1 Таблица2
Ред Стоиност Ред Стоиност
1 ст"а" 1 ст"d"
2 ст"b" 2 ст"e"
3 ст"c" 3 ст"f "
Трябват ми комбинациите от следните редове/но пак казжам това да се отнася за всичките комбинации от 300 таблици/
Таблица 1 - ред1 комбиниран с ред 2 и 3 от Таблица 2
Таблица 1 - ред2 комбиниран с ред 1 и 3 от Таблица 2
Таблица 1 - ред3 комбиниран с ред 1 и 2 от Таблица 2
Таблица 2 - ред1 комбиниран с ред 2 и 3 от Таблица 1
Таблица 2 - ред2 комбиниран с ред 1 и 3 от Таблица 1
Таблица 2 - ред3 комбиниран с ред 1 и 2 от Таблица 1
Благодаря ви предварително за помоща и ще бъда благодарен ако дадете някакви идеи
Поздрави
Мишо
имам следният въпрос към вас с молба за помощ. Трябва да обединя множество таблици около 300 да кажем с по 3 реда всяка.При обединяването MySQL би трябвало да направи някъде около 3 на степен 300 комбинации.Първият въпрос ми е дали подобно нещо е реално да се извърши или ще забие компа?
Вторият ми въпрос е:Да кажем че успее да направи всичките комбинации на мен ще ми трябват само някои от тях.Ето един пример с 2 таблици като този принцип трябва да се отнася за комбинация от 300 например
Таблица 1 Таблица2
Ред Стоиност Ред Стоиност
1 ст"а" 1 ст"d"
2 ст"b" 2 ст"e"
3 ст"c" 3 ст"f "
Трябват ми комбинациите от следните редове/но пак казжам това да се отнася за всичките комбинации от 300 таблици/
Таблица 1 - ред1 комбиниран с ред 2 и 3 от Таблица 2
Таблица 1 - ред2 комбиниран с ред 1 и 3 от Таблица 2
Таблица 1 - ред3 комбиниран с ред 1 и 2 от Таблица 2
Таблица 2 - ред1 комбиниран с ред 2 и 3 от Таблица 1
Таблица 2 - ред2 комбиниран с ред 1 и 3 от Таблица 1
Таблица 2 - ред3 комбиниран с ред 1 и 2 от Таблица 1
Благодаря ви предварително за помоща и ще бъда благодарен ако дадете някакви идеи
Поздрави
Мишо
Re: Обединяване на таблици
select * from tabl1,tabl2 where tabl1.id != tabl2.id
select * from tabl2,tabl1 where tabl1.id != tabl2.id
Ако са 3 таблиците - ще имаш доста повече селекти, а where - ще нарастне доста:
select * from tabl1,tabl2,tabl3 where tabl1.id != tabl2.id and tabl1.id != tabl3.id and tabl2.id != tabl3.id
Според мен е по добре да си ги дръпнеш резултатите в array - за всяка таблица и след това да си ги комбинираш както ти е кеф.
Bеer? Mоre?
Плацебото
select * from tabl2,tabl1 where tabl1.id != tabl2.id
Ако са 3 таблиците - ще имаш доста повече селекти, а where - ще нарастне доста:
select * from tabl1,tabl2,tabl3 where tabl1.id != tabl2.id and tabl1.id != tabl3.id and tabl2.id != tabl3.id
Според мен е по добре да си ги дръпнеш резултатите в array - за всяка таблица и след това да си ги комбинираш както ти е кеф.
Bеer? Mоre?
Плацебото
Re: Обединяване на таблици
Благодаря ти за бързият отговор. :) Само едно уточнение.Ако вкарам всички комбинации от 300 таблици в array в PHP нали пак ще трябва да описжам селекциите на отделните елементи на масива кое да ми покаже и кое не.От базата данни ще го варне като асоциативен масив. А и относно първият ми въпрос...предвид броя на комбинациите дето се получва 3 на степен 300...не би ли се получил проблем?
Благодаря отново
:)
Благодаря отново
:)
Re: Обединяване на таблици
Разбира се че ще се получи - всякак ще се получи - и на асемблер да въртиш - пак ще е сложно.
Но пък може да видиш кога баш ще ти гръмне машината - в смисъл увеличаваш постепенно - 2,3,4,5,6,7 ... таблици, докато я успиш напълно

.
Ако имаш масивите - аз бих го правил на C - би могъл да почнеш да генерираш комбинации докато си задръстиш хард диска.
2 на степен 32 - са някакви си жалки 4 милиарда - по един байт да е - станаха 4 гига.
Мисля че при около 20 таблици - ще окапеш - 3 на 20 е 3 милиарда.
Тоест ще ти трябва доста памет да знаеш
Bеer? Mоre?
Плацебото
Но пък може да видиш кога баш ще ти гръмне машината - в смисъл увеличаваш постепенно - 2,3,4,5,6,7 ... таблици, докато я успиш напълно
Ако имаш масивите - аз бих го правил на C - би могъл да почнеш да генерираш комбинации докато си задръстиш хард диска.
2 на степен 32 - са някакви си жалки 4 милиарда - по един байт да е - станаха 4 гига.
Мисля че при около 20 таблици - ще окапеш - 3 на 20 е 3 милиарда.
Тоест ще ти трябва доста памет да знаеш
Bеer? Mоre?
Плацебото
Re: Обединяване на таблици
Ами как тогава да завъртя всичките комбинации така че да не забие машината.В масив и после да му дам да върти комбинациите.?Или ако имаш предвид някакъв друг алгоритъм ще се радвам да го споделиш :) ммога да го напиша на ПХП :)
Re: Обединяване на таблици
Очевидно 6-те реда в примерния резултат не са 3^2! Я пак виж нещо факториелна сложност да не бъркаш.
Как точно комбинираш 3-та таблица, щото това което бирата е написал е зловещо.
cheers,
</wqw>
[линк]
Как точно комбинираш 3-та таблица, щото това което бирата е написал е зловещо.
cheers,
</wqw>
[линк]
Re: Обединяване на таблици
Значи при 2 таблици комбинациите които ми трябват са
Таблица 1 - ред1 комбиниран с ред 2 и 3 от Таблица 2
Таблица 1 - ред2 комбиниран с ред 1 и 3 от Таблица 2
Таблица 1 - ред3 комбиниран с ред 1 и 2 от Таблица 2
Таблица 2 - ред1 комбиниран с ред 2 и 3 от Таблица 1
Таблица 2 - ред2 комбиниран с ред 1 и 3 от Таблица 1
Таблица 2 - ред3 комбиниран с ред 1 и 2 от Таблица 1
Тоест тук от пълното комбиниране = 9 реда взимам само 6 в които дефакто редовете от едната таблица и втората не се повтарят
При три таблици трябва да са следните комбинации
Таблица 1 - ред1 комбиниран с ред 2 и 3 от Таблица 2
Таблица 1 - ред2 комбиниран с ред 1 и 3 от Таблица 2
Таблица 1 - ред3 комбиниран с ред 1 и 2 от Таблица 2
Таблица 1 - ред1 комбиниран с ред 2 и 3 от Таблица 3
Таблица 1 - ред2 комбиниран с ред 1 и 3 от Таблица 3
Таблица 1 - ред3 комбиниран с ред 1 и 2 от Таблица 3
Таблица 2 - ред1 комбиниран с ред 2 и 3 от Таблица 1
Таблица 2 - ред2 комбиниран с ред 1 и 3 от Таблица 1
Таблица 2 - ред3 комбиниран с ред 1 и 2 от Таблица 1
Таблица 2 - ред1 комбиниран с ред 2 и 3 от Таблица 3
Таблица 2 - ред2 комбиниран с ред 1 и 3 от Таблица 3
Таблица 2 - ред3 комбиниран с ред 1 и 2 от Таблица 3
Таблица 3 - ред1 комбиниран с ред 2 и 3 от Таблица 1
Таблица 3 - ред2 комбиниран с ред 1 и 3 от Таблица 1
Таблица 3 - ред3 комбиниран с ред 1 и 2 от Таблица 1
Таблица 3 - ред1 комбиниран с ред 2 и 3 от Таблица 2
Таблица 3 - ред2 комбиниран с ред 1 и 3 от Таблица 2
Таблица 3 - ред3 комбиниран с ред 1 и 2 от Таблица 2
тоест 3 таблици комбинациите мейду таблиците е 3!=6 и по 3 комбинации за всяка = 18 комбинации.
Плс ако имате идея как да реша този проблем моля споделете я
Отново много благодаря за помоща
Таблица 1 - ред1 комбиниран с ред 2 и 3 от Таблица 2
Таблица 1 - ред2 комбиниран с ред 1 и 3 от Таблица 2
Таблица 1 - ред3 комбиниран с ред 1 и 2 от Таблица 2
Таблица 2 - ред1 комбиниран с ред 2 и 3 от Таблица 1
Таблица 2 - ред2 комбиниран с ред 1 и 3 от Таблица 1
Таблица 2 - ред3 комбиниран с ред 1 и 2 от Таблица 1
Тоест тук от пълното комбиниране = 9 реда взимам само 6 в които дефакто редовете от едната таблица и втората не се повтарят
При три таблици трябва да са следните комбинации
Таблица 1 - ред1 комбиниран с ред 2 и 3 от Таблица 2
Таблица 1 - ред2 комбиниран с ред 1 и 3 от Таблица 2
Таблица 1 - ред3 комбиниран с ред 1 и 2 от Таблица 2
Таблица 1 - ред1 комбиниран с ред 2 и 3 от Таблица 3
Таблица 1 - ред2 комбиниран с ред 1 и 3 от Таблица 3
Таблица 1 - ред3 комбиниран с ред 1 и 2 от Таблица 3
Таблица 2 - ред1 комбиниран с ред 2 и 3 от Таблица 1
Таблица 2 - ред2 комбиниран с ред 1 и 3 от Таблица 1
Таблица 2 - ред3 комбиниран с ред 1 и 2 от Таблица 1
Таблица 2 - ред1 комбиниран с ред 2 и 3 от Таблица 3
Таблица 2 - ред2 комбиниран с ред 1 и 3 от Таблица 3
Таблица 2 - ред3 комбиниран с ред 1 и 2 от Таблица 3
Таблица 3 - ред1 комбиниран с ред 2 и 3 от Таблица 1
Таблица 3 - ред2 комбиниран с ред 1 и 3 от Таблица 1
Таблица 3 - ред3 комбиниран с ред 1 и 2 от Таблица 1
Таблица 3 - ред1 комбиниран с ред 2 и 3 от Таблица 2
Таблица 3 - ред2 комбиниран с ред 1 и 3 от Таблица 2
Таблица 3 - ред3 комбиниран с ред 1 и 2 от Таблица 2
тоест 3 таблици комбинациите мейду таблиците е 3!=6 и по 3 комбинации за всяка = 18 комбинации.
Плс ако имате идея как да реша този проблем моля споделете я
Отново много благодаря за помоща
Re: Обединяване на таблици
Не може ли да напишеш алгоритъм който комбинира всяка таблица с всяка (имам предвид една по една) и резултата да го инсъртваш в междинна таблица. Съответно ще слагаш някакво име за да знаеш това точно коя комбинация е. Така ще ползваш диска, отделен въпрос е дали и диска ще ти стигне за всички комбинации.
Re: Обединяване на таблици
Уфф - не мога да направя точна сметка, ама все ми е на акъла че твоята няма да я бъде - в смисъл няма достатъчно капацитет на земята та да запомниш резултатите.
Иначе - със селекти взимаш резултатите в 300 масива, които в същност са част от по голям масив.
И след това почваш да въртиш цикли като..... докато лагерите на вентилатора ти станат квадратни....
За опит - пробвай с 2,3 и т.н. таблици - като засичаш колко време отнема, особено като минеш 10 ...
С 2, 3, 4 - в същност ще тестваш да видиш дали правилно въртиш циклите
Bеer? Mоre?
Плацебото
Иначе - със селекти взимаш резултатите в 300 масива, които в същност са част от по голям масив.
И след това почваш да въртиш цикли като..... докато лагерите на вентилатора ти станат квадратни....
За опит - пробвай с 2,3 и т.н. таблици - като засичаш колко време отнема, особено като минеш 10 ...
С 2, 3, 4 - в същност ще тестваш да видиш дали правилно въртиш циклите
Bеer? Mоre?
Плацебото
Re: Обединяване на таблици
-- DROP TABLE Table1, Table2, Table3, Table4, Table5
CREATE TABLE Table1(ID INT NOT NULL)
CREATE TABLE Table2(ID INT NOT NULL)
CREATE TABLE Table3(ID INT NOT NULL)
CREATE TABLE Table4(ID INT NOT NULL)
CREATE TABLE Table5(ID INT NOT NULL)
INSERT Table1
SELECT 1 UNION ALL
SELECT 2 UNION ALL
SELECT 3
INSERT Table2 SELECT ID FROM Table1
INSERT Table3 SELECT ID FROM Table1
INSERT Table4 SELECT ID FROM Table1
INSERT Table5 SELECT ID FROM Table1
SELECT a.Tbl1, a.ID1, b.Tbl2, b.ID2, b.ID3
FROM (
SELECT ID, 1 FROM Table1 UNION ALL
SELECT ID, 2 FROM Table2 UNION ALL
SELECT ID, 3 FROM Table3 UNION ALL
SELECT ID, 4 FROM Table4 UNION ALL
SELECT ID, 5 FROM Table5
) a(ID1, Tbl1)
JOIN (
SELECT a.ID, b.ID, 1 FROM Table1 a, Table1 b WHERE a.ID < b.ID UNION ALL
SELECT a.ID, b.ID, 2 FROM Table2 a, Table2 b WHERE a.ID < b.ID UNION ALL
SELECT a.ID, b.ID, 3 FROM Table3 a, Table3 b WHERE a.ID < b.ID UNION ALL
SELECT a.ID, b.ID, 4 FROM Table4 a, Table4 b WHERE a.ID < b.ID UNION ALL
SELECT a.ID, b.ID, 5 FROM Table5 a, Table5 b WHERE a.ID < b.ID
) b(ID2, ID3, Tbl2)
ON a.Tbl1 <> b.Tbl2 AND a.ID1 <> b.ID2 AND a.ID1 <> b.ID3
ORDER BY Tbl1, Tbl2, ID1
Резултат:
Tbl1 ID1 Tbl2 ID2 ID3
----------- ----------- ----------- ----------- -----------
1 1 2 2 3
1 2 2 1 3
1 3 2 1 2
1 1 3 2 3
1 2 3 1 3
1 3 3 1 2
1 1 4 2 3
1 2 4 1 3
1 3 4 1 2
1 1 5 2 3
1 2 5 1 3
1 3 5 1 2
2 1 1 2 3
2 2 1 1 3
2 3 1 1 2
2 1 3 2 3
2 2 3 1 3
2 3 3 1 2
2 1 4 2 3
2 2 4 1 3
2 3 4 1 2
2 1 5 2 3
2 2 5 1 3
2 3 5 1 2
3 1 1 2 3
3 2 1 1 3
3 3 1 1 2
3 1 2 2 3
3 2 2 1 3
3 3 2 1 2
3 1 4 2 3
3 2 4 1 3
3 3 4 1 2
3 1 5 2 3
3 2 5 1 3
3 3 5 1 2
4 1 1 2 3
4 2 1 1 3
4 3 1 1 2
4 1 2 2 3
4 2 2 1 3
4 3 2 1 2
4 1 3 2 3
4 2 3 1 3
4 3 3 1 2
4 1 5 2 3
4 2 5 1 3
4 3 5 1 2
5 1 1 2 3
5 2 1 1 3
5 3 1 1 2
5 1 2 2 3
5 2 2 1 3
5 3 2 1 2
5 1 3 2 3
5 2 3 1 3
5 3 3 1 2
5 1 4 2 3
5 2 4 1 3
5 3 4 1 2
(60 row(s) affected)
cheers,
</wqw>
[линк]
Re: Обединяване на таблици
Ами ако имаш възможност да промениш този модел от цял куп таблици с по три реда на една обединена
таблица напр. от вида:
тогава няма да топиш лагерите на сървърите си.
Напр. пуснах генератор, който ми запълни:
И тогава :
връща:
таблица напр. от вида:
CREATE TABLE TABLEUNION (
TBL INTEGER NOT NULL,
ROW INTEGER NOT NULL,
VAL VARCHAR(20)
);
тогава няма да топиш лагерите на сървърите си.
Напр. пуснах генератор, който ми запълни:
TBL ROW VAL
1 1 T 1 R1
1 2 T 1 R2
1 3 T 1 R3
2 1 T 2 R1
2 2 T 2 R2
2 3 T 2 R3
..............
299 1 T 299 R1
299 2 T 299 R2
299 3 T 299 R3
300 1 T 300 R1
300 2 T 300 R2
300 3 T 300 R3
И тогава :
SELECT t1.val, t2.val, t3.val
from tableunion t1, tableunion t2, tableunion t3
where t2.tbl=t3.tbl
and t1.tbl<>t2.tbl
and t1.row<>t2.row
and t1.row<>t3.row
and t2.row<t3.row
order by 1, 2, 3
връща:
VAL VAL1 VAL2
T 1 R1 T 2 R2 T 2 R3
T 1 R1 T 3 R2 T 3 R3
T 1 R1 T 4 R2 T 4 R3
T 1 R1 T 5 R2 T 5 R3
T 1 R1 T 6 R2 T 6 R3
T 1 R1 T 7 R2 T 7 R3
T 1 R1 T 8 R2 T 8 R3
T 1 R1 T 9 R2 T 9 R3
T 1 R1 T 10 R2 T 10 R3
........
T 1 R2 T 2 R1 T 2 R3
T 1 R2 T 3 R1 T 3 R3
..........
T 1 R2 T 300 R1 T 300 R3
T 1 R3 T 2 R1 T 2 R2
...........
T 300 R3 T 298 R1 T 298 R2
T 300 R3 T 299 R1 T 299 R2
Execute time = 3s 0ms
Редактирано от NDeu на
Re: Обединяване на таблици
Ако опитам първо да задам критерият за селектиране това ще редуцира комбинациите с 1/3.
Тоест преди да генерирам комбинациите му задавам да прави обединения само между редовете които на мен ми трябват.Но това ще намали с 1/3 комбинациите...а предвид броят им..едва ли пак ще се получи...май трябва да е с масиви
Отново благодаря за отделеното време
Тоест преди да генерирам комбинациите му задавам да прави обединения само между редовете които на мен ми трябват.Но това ще намали с 1/3 комбинациите...а предвид броят им..едва ли пак ще се получи...май трябва да е с масиви
Отново благодаря за отделеното време