Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Potrójny JOIN
Forum PHP.pl > Forum > Bazy danych > MySQL
scanner
Trochę się pogubiłem. Mam 4 tabele o (mniej więcej) nastepującej strukturze:
Kod
CREATE TABLE news (

  id int(10) unsigned NOT NULL auto_increment,

  dzial_id int(10) unsigned NOT NULL default '0',

  user_id int(10) unsigned default NULL,

  tytul varchar(128) default NULL,

  tresc text,

  PRIMARY KEY  (id),

) TYPE=MyISAM;



CREATE TABLE news_categories (

  id int(10) unsigned NOT NULL auto_increment,

  nazwa varchar(32) default NULL,

  symbol varchar(32) default NULL,

  PRIMARY KEY  (id),

) TYPE=MyISAM;



CREATE TABLE news_comments (

  id int(10) unsigned NOT NULL auto_increment,

  news_id int(10) unsigned NOT NULL default '0',

  autor varchar(32) NOT NULL default '',

  PRIMARY KEY  (id),

) TYPE=MyISAM;



CREATE TABLE users (

  id int(10) unsigned NOT NULL auto_increment,

  login varchar(32) NOT NULL default '',

  PRIMARY KEY  (id),

) TYPE=MyISAM;
I teraz chcę to wszystko scalić, żeby pokazac newsy na stronie:
Kod
SELECT

  `users`.`login`,

  `users`.`id`,

  `news`.`user_id`,

  `news`.`data_dodania`,

  `news`.`tresc`,

  `news`.`tytul`,

  COUNT(`news_comments`.`id`) AS `id1`,

  `news`.`id` AS `id2`,

  `news`.`dzial_id`,

  `news_categories`.`symbol`,

  `news_categories`.`nazwa`

FROM

  `news_categories`

  RIGHT OUTER JOIN `news` ON (`news_categories`.`id` = `news`.`dzial_id`),

  `news_comments`

  RIGHT OUTER JOIN `news` ON (`news_comments`.`news_id` = `news`.`id`),

  `users`

  RIGHT OUTER JOIN `news` ON (`users`.`id` = `news`.`user_id`)

GROUP BY

  `users`.`login`,

  `users`.`id`,

  `news`.`user_id`,

  `news`.`data_dodania`,

  `news`.`tresc`,

  `news`.`tytul`,

  `news`.`id`,

  `news`.`dzial_id`,

  `news_categories`.`symbol`,

  `news_categories`.`nazwa`

ORDER BY

  `news`.`id` DESC
Niestety w wyniku otrzymuję:
Cytat
MySQL zwrócił komunikat:  

Not unique table/alias: 'news'
Gdzie mój błąd?
Zapytanie potrzebowałbym na teraz, a szef mi sie kręci za plecami i za bardzo nie mam jak pogrzebać w manualu.
BTW: Zapytanie stworzyłem EMS MySQL Managerem.
Jabol
Przy joinach trzy razy dołączasz tą samą tabelę, spróbuj to zrobić za pomocą jednego, ale używając OR/AND.
DeyV
Zamiast męczyć się z tym ręcznie sciagnij trialową wersję http://ems-hitech.com/querybuilder/ - zapobiegnie to tego typu błędom
scanner
Właśnie o to chodzi, że EMS MySQL Manager ma wbudowanego Query Buildera'a i takie zapytanie mi wygenerował. Ręcznie to teraz się bawię, ale nic mi nie wychodzi. Szukałem w komentarzach , ale albo ja głupi, albo nikt nie podrzucił na to pomysłu...
Walczę dalej. 3mta kciuki.
DeyV
Mi, po pewnych modyfikcajach wygenereował tak:
Kod
SELECT

  `news_categories`.`nazwa`,

  `news_categories`.`symbol`,

  `news`.`tytul`,

  `news`.`tresc`,

  `news_comments`.`autor`,

  `users`.`login`

FROM

  `news`

  INNER JOIN `news_categories` ON (`news`.`dzial_id` = `news_categories`.`id`)

  INNER JOIN `users` ON (`news`.`user_id` = `users`.`id`)

  INNER JOIN `news_comments` ON (`news`.`id` = `news_comments`.`news_id`)

teraz wystaczy do tego dodać group i count
scanner
Udało się smile.gif
Finalnie zapytanie (thx DeyV) wygląda u mnie tak:
Kod
SELECT

  `news`.`id` AS `NewsID`,

  `news`.`user_id` AS `NewsAuthorID`,

  `news`.`dzial_id` AS `NewsCategoryID`,

  `news_categories`.`symbol` AS `NewsCategoryIcon`,

  `news_categories`.`nazwa` AS `NewsCategoryName`,

  COUNT(`news_comments`.`id`) AS `NewsCommentSum`,

  `users`.`login` AS `NewsAuthor`,

  `news`.`tytul` AS `NewsTitle`,

  `news`.`tresc` AS `newsBody`,

  `news`.`data_dodania` AS `newsAdded`

FROM

  `news`

  LEFT OUTER JOIN `news_categories` ON (`news`.`dzial_id` = `news_categories`.`id`)

  LEFT OUTER JOIN `users` ON (`news`.`user_id` = `users`.`id`)

  LEFT OUTER JOIN `news_comments` ON (`news`.`id` = `news_comments`.`news_id`)

GROUP BY

  `news`.`id`

ORDER BY

  `news`.`id` DESC

LIMIT 0, 30
Jak na razie wyświetla to co chcę. Gdyby wystąpiły jakies przekłamania, pociągnę ten wątek dalej.
DeyV
Ale, mimo ze nie chcę być wścibski winksmiley.jpg - dlaczego tworzysz tak złożoną klauzulę GROUP BY? Czy nie osiągnąłbyś tego samego poprzez GROUP BY `news`.`id` ?
scanner
AAA... no tak... Człowiek chyba się za bardzo przyzwyczaił do kreatorów smile.gif Jasne, ze te jedno pole wystarczy. Zapytanie powyżej wyedytowałem smile.gif
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.