Potrójny JOIN |
Potrójny JOIN |
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 ( I teraz chcę to wszystko scalić, żeby pokazac newsy na stronie:
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; Kod SELECT Niestety w wyniku otrzymuję:`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 Cytat MySQL zwrócił komunikat: Gdzie mój błąd?
Not unique table/alias: 'news' 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. -------------------- |
|
|
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.
|
|
|
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..."
|
|
|
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. -------------------- |
|
|
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..."
|
|
|
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ę
Finalnie zapytanie (thx DeyV) wygląda u mnie tak: Kod SELECT Jak na razie wyświetla to co chcę. Gdyby wystąpiły jakies przekłamania, pociągnę ten wątek dalej.
`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 -------------------- |
|
|
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 - 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..."
|
|
|
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 Jasne, ze te jedno pole wystarczy. Zapytanie powyżej wyedytowałem
-------------------- |
|
|
Wersja Lo-Fi | Aktualny czas: 28.04.2024 - 07:41 |