Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Da się jednym zapytaniu ?
XDocTorX
post
Post #1





Grupa: Zarejestrowani
Postów: 48
Pomógł: 6
Dołączył: 16.07.2006
Skąd: Jarosław

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


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?
Go to the top of the page
+Quote Post
adminik
post
Post #2





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 22.01.2008
Skąd: Tarnobrzeg

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


Kod
SELECT * FROM tabela WHERE id='idnewsa'

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


--------------------
 
Go to the top of the page
+Quote Post
XDocTorX
post
Post #3





Grupa: Zarejestrowani
Postów: 48
Pomógł: 6
Dołączył: 16.07.2006
Skąd: Jarosław

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


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 ?

Ten post edytował XDocTorX 9.07.2008, 23:39:59
Go to the top of the page
+Quote Post
widmo17
post
Post #4





Grupa: Zarejestrowani
Postów: 24
Pomógł: 3
Dołączył: 17.03.2008
Skąd: niekąd

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


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 ;]


--------------------
"Lecz nikt nie może tracić z oczu tego, czego pragnie. Nawet kiedy przychodzą chwile, gdy zdaje się, że świat i inni są silniejsi. Sekret tkwi w tym, by się nie poddać."
www.widmo.tk - zapraszam na mój homepage ;>
Go to the top of the page
+Quote Post
Sil3nt
post
Post #5





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 9.07.2008

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


a nie da się tak?
Kod
SELECT *, (SELECT COUNT(komantarze.id) WHERE komentarze.idnewsa=news.id)  AS ilosc FROM news
Go to the top of the page
+Quote Post
XDocTorX
post
Post #6





Grupa: Zarejestrowani
Postów: 48
Pomógł: 6
Dołączył: 16.07.2006
Skąd: Jarosław

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


  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
Go to the top of the page
+Quote Post
Zajec
post
Post #7





Grupa: Zarejestrowani
Postów: 1 086
Pomógł: 8
Dołączył: 10.12.2003

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


Sprawdzisz?
  1. SELECT *, (SELECT COUNT(*) FROM comment WHERE id_news=news.id) AS ilosc FROM news;


Ten post edytował Zajec 10.07.2008, 11:29:09
Go to the top of the page
+Quote Post
XDocTorX
post
Post #8





Grupa: Zarejestrowani
Postów: 48
Pomógł: 6
Dołączył: 16.07.2006
Skąd: Jarosław

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


wielkie dzięki Działa już.
Go to the top of the page
+Quote Post
tommy4
post
Post #9





Grupa: Zarejestrowani
Postów: 288
Pomógł: 12
Dołączył: 2.12.2005

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


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.
Go to the top of the page
+Quote Post
limak
post
Post #10





Grupa: Zarejestrowani
Postów: 46
Pomógł: 0
Dołączył: 13.03.2004
Skąd: Siemianowice Śl.

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


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.


--------------------
karczmarczyk.com
Go to the top of the page
+Quote Post
osiris
post
Post #11





Grupa: Zarejestrowani
Postów: 121
Pomógł: 15
Dołączył: 19.07.2007

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


  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
Go to the top of the page
+Quote Post
XDocTorX
post
Post #12





Grupa: Zarejestrowani
Postów: 48
Pomógł: 6
Dołączył: 16.07.2006
Skąd: Jarosław

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


myśle że wydajniejszym sposobem będzie dodanie jednak pola w newsach odpowiadającego liczbie newsów, Dzięki za wskazanie rozwiązania Pozdrawiam.
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 Aktualny czas: 19.08.2025 - 02:05