Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wolny LEFT JOIN
redman2
post
Post #1





Grupa: Zarejestrowani
Postów: 104
Pomógł: 3
Dołączył: 13.10.2004

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


Musze koniecznie uzyc LEFT JOIN, dlatego, ze musze wyswietlac rowniez wartosci NULL i je pogrupowac.

Mam dwie tabele, jedna skaladajaca sie (do tej pory) z okolo 50000 rekordow, struktura:

  1. CREATE TABLE `email_confirm` (
  2. `id` int(3) NOT NULL AUTO_INCREMENT,
  3. `no` varchar(100) NOT NULL,
  4. `email` varchar(100) NOT NULL',
  5. `date` datetime NOT NULL,
  6. `ver` varchar(6) NOT NULL,
  7. PRIMARY KEY (`id`),
  8. KEY `no` (`no`),
  9. KEY `email` (`email`)
  10. ) ENGINE=MyISAM;


A tu druga tabela, zawierajaca kilkanascie rekordow, w ktorej wpisuje ile maili zostalo wyslanych:

  1. CREATE TABLE `email_confirm_sent` (
  2. `id` int(3) NOT NULL AUTO_INCREMENT,
  3. `no` varchar(100) NOT NULL,
  4. `quantity` int(10) NOT NULL,
  5. PRIMARY KEY (`id`),
  6. KEY `no` (`no`),
  7. KEY `quantity` (`quantity`)
  8. ) ENGINE=MyISAM;



I teraz zapytanie, ktore grupuje wszystkie wyslane maile, laczy sie z druga tabela i na tej podstawie moge wylicz procent otwarte/wyslane:

  1. SELECT email_confirm.no, COUNT(email_confirm.no) AS counts, quantity
  2. FROM email_confirm LEFT JOIN email_confirm_sent
  3. ON email_confirm.no = email_confirm_sent.no
  4. WHERE email NOT LIKE '%spa.pl'
  5. GROUP BY email_confirm.no HAVING counts > 10


I problem w tym, ze ten kochany LEFT JOIN opoznia generacje wynikow do okolo 40sek.

Mozna to jakos zoptymalizowac?

Ten post edytował redman2 23.07.2007, 13:44:57
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
redman2
post
Post #2





Grupa: Zarejestrowani
Postów: 104
Pomógł: 3
Dołączył: 13.10.2004

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


Mam indeksy, co widac w pierwszym poscie przy definicji tabel.

A co za roznica czy zrobie RIGHT JOIN czy LEFT JOIN, jezeli ich algorytm jest taki sam, tylko roznia sie tym, ze argument zamiast z lewej, jest z prawej strony.

Z dokumentacji MySQL 5:
The implementation of RIGHT JOIN is analogous to that of LEFT JOIN with the roles of the tables reversed.

Poza tym "count" liczy te z NULL tez, dlatego, ze je grupuje.

Napisalem tez, ze musze koniecznie uzyc LEFT JOIN, a to dlatego, ze zalezy mi na zliczaniu tych rekordow ktore sa NULL.

Wyjasnie to na przykladzie: Wysylam iles tam tysiecy maili dziennie. Kazda grupa maili na swoj tytul i po otwarciu kazdego z nich zapisywany jest w bazie z danym tytulem i adresem email osoby otwierajacej. To jest pole 'no'.
Druga tabela, natomiast, jest zwykla sumaryczna tabela tematow, z kolumna ile maili zostalo wyslanych z danej grupy.

I dlatego wlasnie musze miec NULL, bo jezeli po zlaczeniu nie ma wartosci w drugiej tabeli, znaczy to, ze musi tam byc wpisana ilosc wyslanych maili.

A tu INNER JOIN odpada.

Ten post edytował redman2 23.07.2007, 15:12:58
Go to the top of the page
+Quote Post

Posty w temacie


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: 12.10.2025 - 18:08