Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Da się jednym zapytaniu ?
Forum PHP.pl > Forum > Bazy danych > MySQL
XDocTorX
Stworzyłem tabele komentarze :

| id | id_newsa | tresc | autor | ip | data |

Chciałbym przy pobieraniu newsów od razu mieć liczbę komentarzy bez wysyłania kolejnego zapytania czy jest to możliwe do zrealizowania za pomocą jednego zapytania?
adminik
Kod
SELECT * FROM tabela WHERE id='idnewsa'

Podczepiasz sobie to pod zmienną i masz tablicę smile.gif
XDocTorX
tablice to bym chyba miał gdybym podczepił zmienną pod mysql_fetch_array ?
ale mi chodzi o to że kiedy pobieram newsy zapytaniem
  1. SELECT * FROM news


to wyświetlam za pomocą for() każdy news osobno i problem w tym ze za każdym razem kiedy wyświetlam newsa musiałbym wysyłać zapytanie czy są komentarze do newsa o danym id_news a ja chce mieć to już pobrane, pytam czy tak się da ?
widmo17
Cytat
przy pobieraniu newsów od razu mieć liczbę komentarzy bez wysyłania kolejnego zapytania

Cytat
Kod
SELECT * FROM tabela WHERE id='idnewsa'


Podczepiasz sobie to pod zmienną i masz tablicę smile.gif

Raczej chodzi mu o to, żeby wyciągnąć liczbę komentarzy w jednym zapytaniu wyciągając newsy winksmiley.jpg

Możesz tak zrobić, ale musisz do tabeli newsów dodać coś w stylu "all_comments,all_comments_id", gdzie będą przechowywane wszystkie komentarze dla danego id. Łatwiej jest wysłać dwa zapytania ;]
Sil3nt
a nie da się tak?
Kod
SELECT *, (SELECT COUNT(komantarze.id) WHERE komentarze.idnewsa=news.id)  AS ilosc FROM news
XDocTorX
  1. SELECT *, (SELECT COUNT(comment.id) FROM comment, news WHERE comment.id_news=news.id) AS ilosc FROM news;

to działa tylko że za każdym razem ilosc wynosi taka samą ilość komentarzy które są wogole przypasowane do id_newsa a nie do aktualnego id_newsa

podam wynik który mysql zwrócł :

mysql> SELECT *, (SELECT COUNT(comment.id) from comment, news WHERE comment.id_news=news.id) AS ilosc FROM news;
+----+----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+---------------------+------------+-------+
| id | tytul | tresc| comment | data | uzytkownik | ilosc |
+----+----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+---------------------+------------+-------+
| 1 | tytul news | tresc newsa | 0 | 2008-07-04 19:27:19 | admin | 2 |
| 3 | asd | tresc newsa2 | 1 | 2008-07-02 21:49:32 | admin | 2 |
| 4 | asd asdasd | tresc newsa3 | 1 | 2008-07-02 21:51:32 | admin | 2 |
...
a przecież każdy news ma inną liczbę komentarzy
Zajec
Sprawdzisz?
  1. SELECT *, (SELECT COUNT(*) FROM comment WHERE id_news=news.id) AS ilosc FROM news;
XDocTorX
wielkie dzięki Działa już.
tommy4
Nie sądzę, by było to wydajne...

Trzymaj liczbę komentarzy w oddzielnym polu w tabeli newsów np. comments_count. Najprościej i najszybciej.
limak
Cytat(tommy4 @ 10.07.2008, 15:29:52 ) *
Nie sądzę, by było to wydajne...

Trzymaj liczbę komentarzy w oddzielnym polu w tabeli newsów np. comments_count. Najprościej i najszybciej.


dokładnie, da sie jednym zapytaniem (napisal ktoś wyżej) jednak jest to nieoptymalne... najlepiej stworzyć sobie własnie dodatkowe pole z ilością komentarzy w tabeli news. Oczywiście przy dodawaniu komentarza trzeba wtedy wykonywać dwa zapytania (bo inkrementacja jeszcze), przy usuwaniu również (dekrementacja). Ale to jest właśnie ten przypadek z teorii systemów baz danych gdzie ta niewielka redundancja jest akurat porządanym zjawiskiem. Istotnie, o wiele częściej będziesz wykonywał zapytanie wybierające newsy, niż dodawał/usuwał komentarze, dlatego szkoda zasobów na niewydajne zapytanie na rzecz redundancji ktorą przecież można z łatwością kontrolować by zapobiec konfliktom.
osiris
  1. SELECT *, (SELECT COUNT(*) FROM comment WHERE id_news=news.id) AS ilosc FROM news;

panowie, bez przesady. tam gdzie nie potrzeba podzapytan skolerowanych to lepiej ich nie uzywac

to na pewno bedzie wydajniejsze:
  1. SELECT n.*, CASE i.ile IS NULL THEN 0 ELSE i.ile END
  2. FROM news AS n LEFT JOIN (SELECT id_news , COUNT(*) AS ile
  3. FROM comment GROUP BY id_news) AS i ON i.id_news = n.id
XDocTorX
myśle że wydajniejszym sposobem będzie dodanie jednak pola w newsach odpowiadającego liczbie newsów, Dzięki za wskazanie rozwiązania Pozdrawiam.
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.