Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie do dwóch tabel zwracające rekordy (pytania) bez odpowiedzi
Forum PHP.pl > Forum > Bazy danych > MySQL
Poker
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
mortus
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
Poker
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
mortus
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)
Poker
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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.