Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Dwa zapytania w jednym..
xxdrago
post
Post #1





Grupa: Zarejestrowani
Postów: 654
Pomógł: 42
Dołączył: 27.07.2010
Skąd: Jaworzno

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


Witam, mam 2 tabele:
Kod
CREATE TABLE `komentarze` (
  `lp` smallint(6) NOT NULL auto_increment,
  `id` smallint(6) NOT NULL default '0',
  `data` datetime NOT NULL default '0000-00-00 00:00:00',
  `www` text collate utf8_polish_ci NOT NULL,
  `autor` varchar(255) collate utf8_polish_ci NOT NULL default '',
  `email` varchar(100) collate utf8_polish_ci NOT NULL,
  `ip` text collate utf8_polish_ci NOT NULL,
  `przegladarka` text collate utf8_polish_ci NOT NULL,
  `zalogowany` varchar(50) collate utf8_polish_ci NOT NULL,
  `tresc` text collate utf8_polish_ci NOT NULL,
  PRIMARY KEY  (`lp`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci COMMENT='Komentarze' AUTO_INCREMENT=88;
-- --------------------------------------------------------

--
-- Struktura tabeli dla  `newsy_strony`
--

CREATE TABLE `newsy_strony` (
  `id` smallint(6) NOT NULL auto_increment,
  `nazwa` text collate utf8_polish_ci NOT NULL,
  `data` datetime NOT NULL default '0000-00-00 00:00:00',
  `autor` varchar(255) collate utf8_polish_ci NOT NULL default '',
  `tresc` text collate utf8_polish_ci NOT NULL,
  `typ` text collate utf8_polish_ci NOT NULL,
  `link` text collate utf8_polish_ci NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=124;


Normalnie pobieram tak:
Kod
SELECT * FROM  `newsy_strony` WHERE typ =1 ORDER BY `data`


Czy była by możliwość pobrania ilości komentarzy z tabeli `komentarze` ? W jednym zapytaniu zamiast stosować drugie zapytanie:
Kod
SELECT COUNT( * )  FROM komentarze WHERE id =99

0
Myślałem zastosować jakiś JOIN ale nie za bardzo umiem MYSQL (cały czas pogłębiam swoją wiedzę)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
grzes999
post
Post #2





Grupa: Zarejestrowani
Postów: 305
Pomógł: 29
Dołączył: 5.07.2011

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


Musisz połączyć jakoś te tabel. To znaczy w tabeli komentarze musisz dodać pole id_strony które będzie odpowiadało stronie w drugiej tabeli. A później to normalnie

  1. SELECT count(lp) FROM newsy_strony JOIN(komentarze) ON (newsy_strony.id=id_strony)
Go to the top of the page
+Quote Post
xxdrago
post
Post #3





Grupa: Zarejestrowani
Postów: 654
Pomógł: 42
Dołączył: 27.07.2010
Skąd: Jaworzno

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


No mniej więcej coś takiego ale chyba jednak nie:
Kod
SELECT newsy_strony.id, newsy_strony.nazwa, newsy_strony.data, newsy_strony.autor, newsy_strony.tresc, newsy_strony.typ, newsy_strony.link
FROM newsy_strony
LEFT JOIN komentarze ON newsy_strony.id = komentarze.lp


Coś takiego tylko, żeby w tej ostatniej kolumnie pobierało ilość komentarzy do danego newsa ale chyba nie da się czegoś takiego zrobić w jednym zapytaniu...
Go to the top of the page
+Quote Post
gothye
post
Post #4





Grupa: Zarejestrowani
Postów: 702
Pomógł: 65
Dołączył: 16.03.2009

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


Wykonaj to podzapytaniem :

  1. SELECT n.*,(SELECT COUNT( * ) FROM komentarze WHERE id =n.id ) AS ilosc FROM `newsy_strony` AS n WHERE n.typ =1 ORDER BY n.`data`


Go to the top of the page
+Quote Post
grzes999
post
Post #5





Grupa: Zarejestrowani
Postów: 305
Pomógł: 29
Dołączył: 5.07.2011

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


Cytat(xxdrago @ 31.03.2012, 00:42:35 ) *
No mniej więcej coś takiego ale chyba jednak nie:
Kod
SELECT newsy_strony.id, newsy_strony.nazwa, newsy_strony.data, newsy_strony.autor, newsy_strony.tresc, newsy_strony.typ, newsy_strony.link
FROM newsy_strony
LEFT JOIN komentarze ON newsy_strony.id = komentarze.lp


Coś takiego tylko, żeby w tej ostatniej kolumnie pobierało ilość komentarzy do danego newsa ale chyba nie da się czegoś takiego zrobić w jednym zapytaniu...


A nie możesz sobie tego w php już policzyć(IMG:style_emoticons/default/questionmark.gif)
Go to the top of the page
+Quote Post
Pilsener
post
Post #6





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


Najszybsze jest podzapytanie takie jak podał Gothye (join i grupowanie wolniejsze) ale i tak przy większych ilościach danych będziesz miał problemy a już na pewno jeśli będziesz chciał pobrać więcej niż jednego newsa i przeliczyć komentarze "w locie".

Ja bym radził trzymać ilość komentarzy w tabeli z newsami i aktualizować to pole odpowiednią funkcją/metodą podczas dodawania/usuwania komentarza.
Go to the top of the page
+Quote Post
alegorn
post
Post #7





Grupa: Zarejestrowani
Postów: 341
Pomógł: 40
Dołączył: 23.06.2009

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


w mysql bedzie to rzeczywiscie nie wydajnie wczytywac to w locie.

tu masz uproszczony przyklad jak to mozna zrobic, gdybys mimo wszystko chcial takie rozwiazanie.
  1.  
  2. SELECT ns.*, COUNT(k.id) AS ile
  3. FROM `newsy_strony` ns LEFT JOIN komentarze k ON k.id = ns.id
  4. WHERE ns.typ =1
  5. GROUP BY k.id
  6.  


Ten post edytował alegorn 3.04.2012, 10:15:22
Go to the top of the page
+Quote Post
toaspzoo
post
Post #8





Grupa: Zarejestrowani
Postów: 778
Pomógł: 84
Dołączył: 29.07.2010
Skąd: Gliwice / Pławniowice Mistrz niezmordowanej klawiatury.

Ostrzeżenie: (20%)
X----


select count (*) from xxx, * from yyy
Powód edycji: [thek]: Jako żyję, to taką składnię SELECT pomieszanego z FROM, pierwsze widzę...
Go to the top of the page
+Quote Post
thek
post
Post #9





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Może się mylę, ale chyba na chwilę obecna jakoś serwis łączy komentarz określionyy z newsem, a więc po czymś na pewno następuje łączenie. Kwestia: CZEGO? Podejrzewam, że jest to w tabeli komentarzy pole id lub jest do tego osobna tabela łącząca. Jeśli już połapiesz się z joinem, użycie count będzie tylko postawieniem kropki nad i.
Go to the top of the page
+Quote Post

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: 24.12.2025 - 10:47