Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dwa zapytania w jednym..
Forum PHP.pl > Forum > Bazy danych > MySQL
xxdrago
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ę)
grzes999
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)
xxdrago
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...
gothye
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`


grzes999
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ćquestionmark.gif
Pilsener
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.
alegorn
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.  
toaspzoo
select count (*) from xxx, * from yyy
thek
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.
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.