Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Potrójny JOIN
scanner
post 8.05.2003, 08:23:56
Post #1





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




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.


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
Jabol
post 8.05.2003, 08:29:58
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

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


Przy joinach trzy razy dołączasz tą samą tabelę, spróbuj to zrobić za pomocą jednego, ale używając OR/AND.
Go to the top of the page
+Quote Post
DeyV
post 8.05.2003, 09:07:10
Post #3





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




Zamiast męczyć się z tym ręcznie sciagnij trialową wersję http://ems-hitech.com/querybuilder/ - zapobiegnie to tego typu błędom


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
scanner
post 8.05.2003, 09:15:43
Post #4





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




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.


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
DeyV
post 8.05.2003, 09:42:59
Post #5





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




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


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
scanner
post 8.05.2003, 10:14:54
Post #6





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




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.


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
DeyV
post 8.05.2003, 10:26:50
Post #7





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




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` ?


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
scanner
post 8.05.2003, 11:06:08
Post #8





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




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


--------------------
scanner.info
Warto pamiętać: KISS, DRY
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 Wersja Lo-Fi Aktualny czas: 28.04.2024 - 07:41