Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zapytanie Select do kilku tabel o identycznej strukturze.
Niktoś
post
Post #1





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Jestem ciekaw ,czy istnieje możliwość utworzyć jedno zapytanie bez join'ów ,union'ów do kilku tabel ,gdzie jest identyczna struktura kolumn.Czy można coś takiego zrobić?
Select * from Tabela1,Tabel2,Tabela3 where mojaKolumna='jakieś dane'

Nazwa kolumny "mojaKolumna" jest taka sama dla wszystkich tabel.

Chyba jest to niemożliwe,szukam już od ponad 3 godzin po google i jedynie co podpowiada to użycie union all.
Wielka szkoda,myślałem ,że tworzenie tabel o podobnych strukturach,będzie pomocne w takich przypadkach.
Teraz będzie ciężko poskładać query stringa z podzapytaniami w zależności od ilości wybranych opcji.

Ten post edytował Niktoś 12.11.2011, 13:16:46
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
5k7
post
Post #2





Grupa: Zarejestrowani
Postów: 65
Pomógł: 2
Dołączył: 5.12.2006

Ostrzeżenie: (0%)
-----


Jeżeli chcesz robić bardziej zaawansowane rzeczy musisz się nauczyć SQL'a w takim stopniu aby budowanie tych zapytań nie było trudnym zadaniem. Poza tym jeżeli masz identyczną konstrukcję tabel to prawdopodobnie przyjmujesz z góry niezbyt dobrą konstrukcję bazy.

Pozdr
Go to the top of the page
+Quote Post
Niktoś
post
Post #3





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Tworzenie zapytań same w sobie nie jest trudnym zadaniem,ale robienie zapytań w"locie już tak",gdzie jedno zapytanie ma służyć wielu opcjom ,które użytkownik wybiera.To się nazywa dynamiczne zapytanie do sql'a,i utworzenie go w cale nie jest aż takie proste-szczególnie jak struktura kwerendy jest z podzapytaniami.Owszem można dla każdej opcji zbudować na sztywno kwerende i dać to w np. w switch, ale rozwiązanie takie jest dla mnie trywialne,i można powiedzieć bezużyteczne prz opcji multiwybierania.
Cytat
Poza tym jeżeli masz identyczną konstrukcję tabel to prawdopodobnie przyjmujesz z góry niezbyt dobrą konstrukcję bazy

Twoje założenie jest jak najbardziej błędne-przynajmniej w moim przypadku-nie wiem skąd u Ciebie takie stwierdzenie?.

Ten post edytował Niktoś 13.11.2011, 19:36:04
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Twoje założenie jest jak najbardziej błędne-przynajmniej w moim przypadku-nie wiem skąd u Ciebie takie stwierdzenie?.
Ano stąd, że zazwyczaj, gdy istnieje kilka tabel o identycznej strukturze, to prawdopodobnie ktoś przekomplikował sprawę. Być może faktycznie w Twoim przypadku tak zaprojektowana baza ma sens - niestety nie dowiemy się tego, no chyba, że podzielisz się z nami jak wygląda Twoja baza.

Cytat
,ale robienie zapytań w"locie już tak",gdzie jedno zapytanie ma służyć wielu opcjom ,które użytkownik wybiera.To się nazywa dynamiczne zapytanie do sql'a,i utworzenie go w cale nie jest aż takie proste
Tutaj również osobiście nie widzę żadnych problemów. Wszystko stałoby się jaśniejsze, jakbyś podzielił się z nami kodem.
Go to the top of the page
+Quote Post
Niktoś
post
Post #5





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Ja wiem ,że ma sens i to powinno Wam wystarczyć.Kodu nie podam ,bo wątpię, by ktoś go tutaj zrozumiał.
Odnośnie temat ten nie był na temat mojej struktury bazy i jej sensu-lecz na temat kwerendy select która odwołuje się do kilku tabel o tej samej strukturze kolumn.Pytanie brzmiało czy da rady zrobić to bez podzapytań.Szukałem dość długo na googlach i nie znalazłem dobrego sensownego przykładu ,który byłby odpowiedzią na założony temat("jak najprostsza kwerenda realizująca moje zadania,bez podzapytań")
Problem mój można jedynie rozwiązać poprzez UNION ALL-i tą koncepcję będę musiał realizować -i stwierdziłem ,że będzie trudniej z podzapytaniami, a i na to wymyśliłem rozwiązanie.

Ten post edytował Niktoś 13.11.2011, 20:18:08
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Ja wiem ,że ma sens i to powinno Wam wystarczyć
To po grzyba się głupio pytasz
Cytat
nie wiem skąd u Ciebie takie stwierdzenie?.

skoro i tak nie interesuje cię odpowiedź?

Cytat
Kodu nie podam ,bo wątpię, by ktoś go tutaj zrozumiał.
Ałć :/

Cytat
Pytanie brzmiało czy da rady zrobić to bez podzapytań
Tak, ale też się pytałeś
Cytat
nie wiem skąd u Ciebie takie stwierdzenie
więc ci odpowiedziałem. Więc się teraz nie denerwuj, że jakiś nędzny podnóżek ci na to pytanie odpowiada. Jak cię nie interesuje coś, to się o to nie pytaj (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
Niktoś
post
Post #7





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Cytat
Więc się teraz nie denerwuj, że jakiś nędzny podnóżek ci na to pytanie odpowiada

Tego nie powiedziałem ,ani nie pomyślałem.

Byłem tylko ciekawy Dlaczego ten Forumowicz zakłada ,że:
Cytat
Poza tym jeżeli masz identyczną konstrukcję tabel to prawdopodobnie przyjmujesz z góry niezbyt dobrą konstrukcję bazy

Nie znając konstrukcji ,ani zastosowania mojej bazy.
Ale bardziej interesuje mnie
Cytat
czy da rady zrobić to bez podzapytań
-takie zapytanie ułatwiłoby mi znacząco sprawę.
Kodu nie podaję,bo piszę w całkiem innym języku niż PHP.
Tak więc nie urażaj się.

Ten post edytował Niktoś 13.11.2011, 20:34:33
Go to the top of the page
+Quote Post
nospor
post
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Tego nie powiedziałem ,ani nie pomyślałem.
Być może odniosłem mylne wrażenie po tych dwóch Twoich tekstach:
Cytat
Kodu nie podam ,bo wątpię, by ktoś go tutaj zrozumiał.

Cytat
Ja wiem ,że ma sens i to powinno Wam wystarczyć

Jak dla mnie zabrzmiało to jak to jaki to ty nie jesteś "ach i och" i wszystko wiesz, a my ciule zwykli banalnej rzeczy nie zrozumiemy (IMG:style_emoticons/default/wink.gif)

Cytat
Byłem tylko ciekawy Dlaczego ten Forumowicz zakłada ,że:
Cytat
Poza tym jeżeli masz identyczną konstrukcję tabel to prawdopodobnie przyjmujesz z góry niezbyt dobrą konstrukcję bazy

Nie znając konstrukcji ,ani zastosowania mojej bazy.
I ja ci to wyjaśniłem: w 90% procent przypadków na forum taka baza jest wynikiem niewiedzy autora tejże bazy. Jak również napisałem, być może w Twoim przypadku jest inaczej i wyraziłem chęć poznania Twojej bazy z czystej ciekawości.

Cytat
Kodu nie podaję,bo piszę w całkiem innym języku niż PHP.
I teraz wszystko jasne. Zmieniam zdanie na temat "ach i och" (IMG:style_emoticons/default/wink.gif)

Cytat
Tak więc nie urażaj się.
Bardziej niż urażony czułem się rozbawiony (IMG:style_emoticons/default/wink.gif) Pamiętaj jednak, że tutaj są nie tylko PHPowcy i nie generalizuj, że nikt z forum nie zrozumie Twojego kodu napisanego w czymś innym niż PHP.
Go to the top of the page
+Quote Post
Niktoś
post
Post #9





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Postaram zaspokoić Twoją ciekawość na poniższym przykładzie
<select>
kategoria1
kategoria2
kategoria3
kategoria....n
</select>
Użytkownik wybiera kategorie1 i pobiera dane, modernizuje w zależności od sytuacji z tabeli Kategoria1 .
Każdy jedne użytkownik to 20 wpisów w kategorii którą wybrał.
100 użytkowników to -2000 wpisów.
Czy wyszukiwanie użytkownika po kategorii nie będzie szybsze niż ,branie wszystkich kategorii do jednego wora??
Dajmy na to jak serwis odniesie sukces i będzie miał bardzo dużą popularność Będzie w nim
1000000 użytkowników-to jest 20mil wpisów-wyobrażasz sobie pełnotekstowe wyszukiwanie w takiej ilości danych?
Rozbijając tabelę np na cztery kategorie (będzie znacznie więcej)-to wyszukiwanie użytkownika po jego np nazwie ,czy id przebiegnie znacznie szybciej niż pobierając te dane z jednego wora.
Nawet cieszę się ,że tak zrealizowałem to wszystko,gdyż FTS(ful text search na bazie danych MSSQL)-wymaga aktualizacji indexów(indexowania)-i te indexowanie będzie przebiegać bezboleśnie,niż na jednym wielkim worze w który wszyscy są wepchani.

Ten post edytował Niktoś 13.11.2011, 21:13:54
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Dziękuję za zaspokojenie mojej ciekawości (IMG:style_emoticons/default/smile.gif)

Co do problemu:
Cytat
wyobrażasz sobie pełnotekstowe wyszukiwanie w takiej ilości danych
Sam napisałeś, że podzieliłeś tabele na kategorie. Znaczy, że wyszukiwanie nawet pełnotekstowe i tak robisz po kategorii. W takim razie, nawet jak wszystko będzie w jednym worku, to wyszukiwanie i tak najpierw ograniczysz do kategorii a dopiero niejako potem pójdzie pełnokonktestowe wyszukiwanie.
Przy odpowiednich indeksach takie wyszukiwanie nie powinno być dużo gorsze od wyszukiwania po tabeli podzielonej na 4.

Poza tym, patrząc na pytanie, jakie zadałeś na samym początku widać, że i tak na raz chcesz przeszukiwać kilka tabel (kategorii) więc totalnie bez sensu jest dzielić jedną tabelę na kilka, skoro i tak naraz szukać chcesz we wszystkich
Go to the top of the page
+Quote Post
Niktoś
post
Post #11





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Wprowadzam select z muliwyszukiwaniem-osoba będzie mogła wybrać dowolną liczbę kategorii,dodatkowo wprowadzam opcje we wszystkich kategoriach.
Cytat
Sam napisałeś, że podzieliłeś tabele na kategorie. Znaczy, że wyszukiwanie nawet pełnotekstowe i tak robisz po kategorii

Właśnie przy każdym dodaniu rekordu do kategorii dane będą automatycznie indexowane w tejże kategorii.
Reszta tabel kategorii, będzie wolna od tego procesu.Niestety FTS w MSSQL aby działało poprawnie wyszukiwanie,wymagana jest aktualizacja indexów.

Ten post edytował Niktoś 13.11.2011, 21:23:21
Go to the top of the page
+Quote Post
nospor
post
Post #12





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




No tak. Czyli zamiast wyszukiwania po jednej tabeli, będziesz miał wyszukiwania po kilku tabelach, będziesz musiał łączyć tabele jednym zapytaniu - może się okazać, że nie jest to wcale szybsze od jendej tabeli.

Warto by przeprowadzic testy (na większej ilości danych, przecież to nie problem takie wygenerować), analizę indeksów itp.
Go to the top of the page
+Quote Post
Niktoś
post
Post #13





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Cytat
Czyli zamiast wyszukiwania po jednej tabeli, będziesz miał wyszukiwania po kilku tabelach, będziesz musiał łączyć tabele jednym zapytaniu

To jest chyba jedyna wada -w tej mojej strukturze i ma ono miejsce tylko w procesie wyszukiwania typu multi-dlatego stąd moje pytanie o kwerendę bez podzapytań,na którą jeszcze nie dostałem odpowiedzi (IMG:style_emoticons/default/sadsmiley02.gif) ,a mówiłeś ,że można -Mógłbyś podać przykład-albo linka?

Ten post edytował Niktoś 13.11.2011, 21:37:48
Go to the top of the page
+Quote Post
nospor
post
Post #14





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
.Niestety FTS w MSSQL aby działało poprawnie wyszukiwanie,wymagana jest aktualizacja indexów.
Nawet jeśli, to należy się zastanowić co będzie częściej robione: wyszukiwanie, czy aktualizacja danych. Bardzo często przyjmuje się wolniejsze procesy aktualizacji ( nawet dużo wolniejsze) na rzecz szybszych procesów wyszukiwania w przypadku, gdy częściej szukamy/pobieramy niż wkładamy.

Cytat
a mówiłeś ,że można
Zacytuj mnie, bo nie kojarzę tego faktu. Kojarzę jedynie, iż mówiłem, że nie widzę większego problemu w tworzeniu dynamicznych zapytań do bazy. Mówiłem jednak ogólnie, bo jak pisałem nie wiem jakie ty masz kody u siebie (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Niktoś
post
Post #15





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Cytat
Pytanie brzmiało czy da rady zrobić to bez podzapytań

Tak, ale też się pytałeś
Cytat
nie wiem skąd u Ciebie takie stwierdzenie


Może źle to zrozumiałem, jak tak to idę kleić UNION ALL.
Go to the top of the page
+Quote Post
nospor
post
Post #16





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Może źle to zrozumiałem

Źle zrozumiałeś (IMG:style_emoticons/default/smile.gif) Przecież cytowałem Twoje pytanie do 5k7 (IMG:style_emoticons/default/wink.gif)

Cytat
jak tak to idę kleić UNION ALL.
Czyli jednak Cię nie przekonałem. No nic, szkoda. Mogłeś chociaż porobić testy na większej ilości danych.
Go to the top of the page
+Quote Post
Niktoś
post
Post #17





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Ciężko by było wypełniać-gdyż struktura kolumn jest różnorodna.Kolumna typu image ,varchar,bigint-ustawienia ograniczenia długości na varchar'y.-Mógłbym skopiować w pętli rekordy w TSQL- ale nie wiem czy by testy były poprawne,najlepiej by było to robić na różnych rekordach.
Go to the top of the page
+Quote Post
nospor
post
Post #18





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Hmm.... za bardzo nie wiem gdzie widzisz problem w wygenerowaniu przykładowych danych? Bo ja nigdzie, nawet dla pól, ktore podałeś.

Możesz dodatkowo w jednej pętli generować od razu dane dla sytuacji z jedną tabelą oraz dla sytuacji z kilkoma tabelami. Dzięki temu obie sytuacje będą operować na tych samych danych, przez co testy powinny być bardziej wiarygodne.
Go to the top of the page
+Quote Post
5k7
post
Post #19





Grupa: Zarejestrowani
Postów: 65
Pomógł: 2
Dołączył: 5.12.2006

Ostrzeżenie: (0%)
-----


Na wielu tabelach nie bedziesz szybciej przeszukiwał przynajmniej w stopniu dla Ciebie zauważalnym - do tego indeksy - masz różne typy tabel choćby taka jak memory która wymięcie to w moment. Oczywiście trzeba z głową wszystko zrobić. Zresztą jak Ci się serwis rozrośnie i będziesz zarabiał kupę kasy to przesiądziesz się na konkretny serwer/y + oracle (IMG:style_emoticons/default/wink.gif) i wówczas będziesz miał doładowanie wydajnościowe.

Pozdr

Ten post edytował 5k7 14.11.2011, 10:06:10
Go to the top of the page
+Quote Post
prachwal
post
Post #20





Grupa: Zarejestrowani
Postów: 171
Pomógł: 18
Dołączył: 13.03.2009
Skąd: lublin

Ostrzeżenie: (0%)
-----


Cytat(Niktoś @ 13.11.2011, 20:16:12 ) *
Ja wiem ,że ma sens i to powinno Wam wystarczyć.Kodu nie podam ,bo wątpię, by ktoś go tutaj zrozumiał.
Odnośnie temat ten nie był na temat mojej struktury bazy i jej sensu-lecz na temat kwerendy select która odwołuje się do kilku tabel o tej samej strukturze kolumn.Pytanie brzmiało czy da rady zrobić to bez podzapytań.Szukałem dość długo na googlach i nie znalazłem dobrego sensownego przykładu ,który byłby odpowiedzią na założony temat("jak najprostsza kwerenda realizująca moje zadania,bez podzapytań")
Problem mój można jedynie rozwiązać poprzez UNION ALL-i tą koncepcję będę musiał realizować -i stwierdziłem ,że będzie trudniej z podzapytaniami, a i na to wymyśliłem rozwiązanie.


ja trzaskam TSQL-a (IMG:style_emoticons/default/smile.gif) i powiem że masz kretyńską bazę danych - tak się nie projektuje struktur danych

a co do meritum

;with dupa as (
select * from tabela
), dupa2 as (
select * from tabela_2
)

select dupa.* from dupa join dupa2 on dupa.id = dupa2.id

nie napisałeś czy chcesz podzapytanie zwykłe czy skjorelowane
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 14:27