Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zapytanie do dwóch tabel zwracające rekordy (pytania) bez odpowiedzi, Zwraca mi rekordy(pytania) z 1 odpowiedzią
Poker
post 6.06.2011, 09:55:01
Post #1





Grupa: Zarejestrowani
Postów: 205
Pomógł: 3
Dołączył: 20.04.2009
Skąd: Jaworzno

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


Witam,

Mam mały problem z zapytanie, chcę pobrać wszystkie rekordy(pytania) z bazy które są bez odpowiedzi.
Niestety mogę wyświetlić tylko rekordy które mają minimum 1 odpowiedź, a nie mogę wyświetlić tych pustych.

Moje zapytanie:
Kod
mysql_query("SELECT pyt.*, odp.ilosc FROM PORTAL_pytania pyt INNER JOIN(SELECT idPytania, COUNT(id) AS ilosc FROM PORTAL_odpowiedzi GROUP BY idPytania)odp ON odp.idPytania=pyt.id  WHERE odp.ilosc='0' ORDER BY pyt.id DESC LIMIT $limit, $ilosc");



Wydaje mi się że problem jest w
Kod
ON odp.idPytania=pyt.id
bo zlicza mi tylko te rekordy(pytania) które mają odpowiedź, nie wiem jak to przerobić, czy ktoś z dobrego serca mógłby mi pomóc i udzielić rady czemu tak a nie inaczej?

Bardzo dziękuje z góry za pomoc.

Dariusz


--------------------
:) na miliony przyjdzie czas...
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
mortus
post 6.06.2011, 10:53:18
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Ale skoro nie ma odpowiedzi na jakieś pytanie, to i nie ma rekordu w tabeli PORTAL_odpowiedzi. Czyż nie? Jeśli tak, to nie można tych rekordów połączyć JOIN-em, bo ich po prostu nie ma. Wypróbuj:
  1. SELECT * FROM PORTAL_pytania WHERE PORTAL_pytania.id NOT IN (SELECT idPytania FROM PORTAL_odpowiedzi)


EDIT
Wcześniej była liczba pytań bez odpowiedzi.

Można to troszkę przyspieszyć, posortować wg id pytania i pobrać określoną ilość rekordów:
  1. SELECT * FROM PORTAL_pytania WHERE id NOT IN (SELECT DISTINCT idPytania FROM PORTAL_odpowiedzi) ORDER BY id DESC LIMIT $limit, $ilosc


Ten post edytował mortus 6.06.2011, 11:08:25
Go to the top of the page
+Quote Post
Poker
post 6.06.2011, 11:05:51
Post #3





Grupa: Zarejestrowani
Postów: 205
Pomógł: 3
Dołączył: 20.04.2009
Skąd: Jaworzno

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


wielkie dzięki za odpowiedź, ale mam problem.

Dodając takie zapytanie "blokuje się" serwer.

Wczytuje bez końca i strona pada na chwilkę.


W bazie z pytaniami około 6 tysięcy rekordów a w bazie z odpowiedziami 27 tyysięcy, to chyba nie powód?


Poczekałem i załadowało się, ale czas to > 60 sekund, mam serwer VPS więc tutaj raczej to nie jest problem.


Sprawdziłem i bez zmian, ładuję się z prędkością tragiczną. Czyli nie ładuje się w ogóle.
Z phpMyAdmin
Kod
Pokaż rekordy 0 - 29 (429 wszystkich, Wykonanie zapytania trwało 6.8064 sekund(y)) [id: 7300 - 7061]


Tak naprawdę ładowało się > 60 sekund

Ten post edytował Poker 6.06.2011, 11:20:54


--------------------
:) na miliony przyjdzie czas...
Go to the top of the page
+Quote Post
mortus
post 6.06.2011, 11:31:00
Post #4





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


A masz nałożony index na idPytania w tabeli PORTAL_odpowiedzi?

Okazuje się, że przy użyciu JOIN również można to zrobić:
  1. SELECT * FROM PORTAL_pytania LEFT JOIN PORTAL_odpowiedzi ON PORTAL_odpowiedzi.idPytania = PORTAL_pytania.id WHERE PORTAL_odpowiedzi.idPytania IS NULL ORDER BY PORTAL_pytania.id DESC LIMIT $limit, $ilosc


Jednak zarówno LEFT JOIN / IS NULL, jak i NOT IN są porównywalnie optymalne.

EDIT
Tak długi czas wykonywania zapytania ewidentnie świadczy o tym, że kolumna idPytania nie jest zindeksowana. Nałóż index:
  1. CREATE INDEX ix_idPytania ON PORTAL_odpowiedzi(idPytania)


Ten post edytował mortus 6.06.2011, 11:55:21
Go to the top of the page
+Quote Post
Poker
post 6.06.2011, 11:42:02
Post #5





Grupa: Zarejestrowani
Postów: 205
Pomógł: 3
Dołączył: 20.04.2009
Skąd: Jaworzno

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


Cytat(mortus @ 6.06.2011, 12:31:00 ) *
A masz nałożony index na idPytania w tabeli PORTAL_odpowiedzi?

Okazuje się, że przy użyciu JOIN również można to zrobić:
  1. SELECT * FROM PORTAL_pytania LEFT JOIN PORTAL_odpowiedzi ON PORTAL_odpowiedzi.idPytania = PORTAL_pytania.id WHERE PORTAL_odpowiedzi.idPytania IS NULL ORDER BY PORTAL_pytania.id DESC LIMIT $limit, $ilosc


Jednak zarówno LEFT JOIN / IS NULL, jak i NOT IN są porównywalnie optymalne.



Teraz działa poprawnie, indeksu nie było. Zmieniłem troszkę zapytanie i wyświetla się wszystko poprawnie, wielkie dzięki za pomoc i poświęcony czas.


--------------------
:) na miliony przyjdzie czas...
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 18:38