Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> PHP + SQL - spora baza, jakie zapytanie
willi123
post
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 19.03.2010

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


Witam

Mam taki o to problem posiadam, posiadam bazę a w niej 2 tabele każda po ok 900 tys. rekordów. Ich struktura jest identyczna: Id, Nazwa, Miejsce. Muszę teraz obie tabele porównać a mianowicie sprawdzić która nazwa miała największy wzrost(zakładając np. że szukam wzrostów tylko powyżej pewnej liczby np 100). Czyli w sumie muszę porównać wszystkie nazwy w obu tabelach i ich miejsca. Jak to zrobić przy tak dużych bazach żeby nie zapchać serwera ?
Go to the top of the page
+Quote Post
Kocurro
post
Post #2





Grupa: Zarejestrowani
Postów: 461
Pomógł: 32
Dołączył: 17.09.2003
Skąd: Łódź

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


  1. SELECT a.* FROM tabela1 AS a
  2. INTERSECT
  3. SELECT b.* FROM tabela2 AS b


To Ci da różnice pomiędzy dwoma tabelami.

  1. SELECT COUNT(c.miejsce) AS count, c.nazwa FROM
  2. (
  3. SELECT a.* FROM tabela1 AS a
  4. INTERSECT
  5. SELECT b.* FROM tabela2 AS b
  6. ) AS c GROUP BY c.nazwa ORDER BY count DESC


A to powinno dać informacje o największej zmianie grupując po nazwie:)

A jeśli chodzi o drugą część pytania - jak to zrobić by nie zapchać serwera ... najprościej zainwestować w dobrze skonfigurowany serwer - wtedy nie da rady go łatwo zapchać a takie zapytanie pójdzie raz dwa.

Oczywiście nie podałeś dokładnej struktury tabel więc zakładam, że zawierają indeksy - jeśli nie to koniecznie musisz utworzyć odpowiednie indeksy.

Pozdrawiam,
Łukasz

PS: Nie ten dział
Go to the top of the page
+Quote Post
tehaha
post
Post #3





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


nie wiem czy ja nie zrozumiałem pytania, czy Ty po prostu pytasz o kompletne podstawy, jeżeli chcesz pobrać rekordy dla których kolumna wzrost spełnia warunek: > 100 to robisz
  1. SELECT ID,Nazwa FROM nazwa tabeli WHERE wzrost > 100
, jeżeli chcesz wyciągnąć rekordy z 2 tabel i ich struktura jest taka sama to wydaje mi się że możesz złączyć te zapytania przez UNION


Ten post edytował tehaha 19.03.2010, 10:54:52
Go to the top of the page
+Quote Post
willi123
post
Post #4





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 19.03.2010

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


Dzięki za odp ale...

Hmm nie chodzi o to zeby pobrac tylko z tabeli wzrost powyzej 100 a żeby najpierw porównać 2 tabele po ok 900 tys rekordów i obliczać te różnice(wzrost, spadek lub bez zmian) natomiast wyświetlić tylko te dla których będzie wzrost i to powyżej jakiejś liczby np 100

Wyświetlić już potem nie jest problem ale jak porównać w czasie rzeczywistym 2 tak duże tabele i wyliczyć dla każdej nazwy jej różnicę(miejsc)


np.


Tabela nr 1:

ID Nazwa Miejsce

1 abcd 12000


Tabela nr 2:

Id Nazwa Miejsce

3 abcd 11850



Po porównaniu tych obu rekordów(gdyż ich nazwy są identyczne) wychodzi nam różnica 150, czyli wyświetlamy. Z tym że w ten sam sposób trzeba porównać 2 tabele i w każdej z nich ponad 900 tys rekordów.


Jest jakiś sposób,żeby to w miare gładko poszło ?
Go to the top of the page
+Quote Post
thek
post
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Nie wiem czy dobrze zrozumiałem, ale chcesz zrobić coś takiego, że masz w obu tabelach te same pola (ale pod różnymi ID) i jedna z kolumn zawiera dane, których różnica większa niż 100 Cię interesuje?

Jesli tak to zrób JOIN po obu tabelach wedle tego pola, które jest identyczne i wyświetl jedynie te, których wartość abs różnicy kolumn jest większa niż interesująca Cię wartość.
Coś w deseń
  1. SELECT jakieś pola FROM tabela1 AS a JOIN tabela2 AS b ON a.nazwa = b.nazwa WHERE abs(a.miejsce - b.miejsce) > 100
Oczywiście pole nazwa masz chyba unikatowe? Jeśli nie, kombinować trzeba inaczej (IMG:style_emoticons/default/smile.gif) Ale to tylko zgaduję, bo nie wiemy wiele więcej, jak choćby to, czy obie te tabele w jakimś stopniu się pokrywają...
Go to the top of the page
+Quote Post
willi123
post
Post #6





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 19.03.2010

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


Hmm, dzięki za pomoc. Te zapytanie z Join wygląda na takie, które może pasować, pytanie tylko czy skrypt nie będzie mulić. Będę testować.


Jeśli chodzi o domysły co do struktury to: Tak, pola o tej samej nazwie mogą mieć różne ID, szukamy tylko pól w których nazwa jest taka sama i zawsze to będzie po 1 rekordzie w danej tabeli(nazwy w każdej tabeli są unikatowe) aczkolwiek nie zawsze będzie można porównać bo nie wszystkie nazwy mają swój odpowiednik(identyczną nazwę) w drugiej tabeli. Zatem porównuje tylko te które mają identyczną nazwę w obu tabelach(jak mówiłem nie może być więcej niż 1 w danej tabeli), jest ich z 900 tys ok 750 tys i powiedzmy że tylko te 750 tys trzeba porównać, tzn, obliczyć ich różnicę i wypluć większą od np. 100.
Go to the top of the page
+Quote Post
thek
post
Post #7





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




A więc na początek sprawdź czy połączy prawidłowo te tabele :Jak? W polach pokazywanych w wyniku wyświetla odpowiedniki a.nazwa, b.nazwa i zobacz czy są identyczne i nie łaczy głupot (wsumie nie powinien (IMG:style_emoticons/default/smile.gif) ) A potem tylko ten WHERE walnąć i w sumie nawet można to zrobić tak:
  1. SELECT a.nazwa, b.nazwa, a.miejsce, b.miejsce, abs(a.miejsce - b.miejsce) AS roznica FROM tabela1 AS a JOIN tabela2 AS b ON a.nazwa = b.nazwa WHERE roznica > 100
i powinieneś wszystko ładnie widzieć (IMG:style_emoticons/default/smile.gif) W razie czego potem sobie tylko nie pasujące Ci pola do wyświetlania wywalisz z SELECT.
Go to the top of the page
+Quote Post

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: 3.10.2025 - 20:58