[SQL] LEFT JOIN - Problem

resoucer

Gesperrt
ID: 77379
L
20 April 2006
2.846
109
Hi, folgender code steht akt bereit:

PHP:
select aktiv.vergid,aktiv.status,verg.art from 
`kampangnen_u_aktiv` as aktiv 
LEFT JOIN `kampangnen_verg` as verg ON (verg.id=aktiv.vergid) 
where aktiv.status='aktiv'
klappt auch
nur brauch ich jetzt die spalte url & img aus der tabelle `kampangnen_img` und um das zu bewerkstelligen muss man

aus der tabelle `kampangnen_u_aktiv` die spalte "vergid" in verbindung mit `kampangnen_verg` spalte "id" ziehen, damit man die spalte "art" bekommt
mit der spalte "art" dann kann man halt in der tabelle `kampangnen_img` wheren img.art=kampangnen_verg.art und die tabelle `kampangnen_img` mit den inhalt url & img selecten

Hoffe ich habe das so richtig rüber gebracht
Also akt. kommt halt alles bis auf die url und img welches in der tabelle `kampangnen_img` steht


EDIT: Hier mal nen ausschnitt ausm sql
PHP:
CREATE TABLE `kampangnen_img` (
  `id` int(11) NOT NULL auto_increment,
  `kampangnenid` int(8) NOT NULL,
  `img` varchar(200) collate latin1_general_ci NOT NULL,
  `url` varchar(200) collate latin1_general_ci NOT NULL,
  `art` char(11) collate latin1_general_ci NOT NULL);


CREATE TABLE `kampangnen_u_aktiv` (
  `kampangnenid` smallint(6) NOT NULL,
  `status` enum('a','w') collate latin1_general_ci NOT NULL,
  `userid` smallint(6) NOT NULL,
  `vergid` int(5) NOT NULL);

CREATE TABLE `kampangnen_verg` (
  `id` int(11) NOT NULL auto_increment,
  `kampangnenid` int(8) NOT NULL,
  `art` enum('popup') collate latin1_general_ci NOT NULL,
  `verguetung` varchar(100) collate latin1_general_ci NOT NULL 
  PRIMARY KEY  (`id`);
 
einfach noch nen inner joinm dran hängen.
PHP:
 INNER JOIN kampangnen_img ON(aktiv.art = kampangnen_img.art)
 
Nur mal ne Frage nebenbei, wo wir beim "joinen" sind.
Ist "Joinen" besser / schneller als folgendes?
SELECT `u`.`id`, `d`.`vorname` FROM `user` AS `u`, `userdaten` AS `d` WHERE `u`.`id`=`d`.`id` AND `u`.`id`=1
Denn diese Methode finde ich viel "leichter", praktischer.
 
Nur mal ne Frage nebenbei, wo wir beim "joinen" sind.
Ist "Joinen" besser / schneller als folgendes?
SELECT `u`.`id`, `d`.`vorname` FROM `user` AS `u`, `userdaten` AS `d` WHERE `u`.`id`=`d`.`id` AND `u`.`id`=1
Denn diese Methode finde ich viel "leichter", praktischer.

Sollte gleich schnell sein. Der Query wird ja vor der Ausführung "optimiert" und da müsste am ende aus INNER JOIN und , das selbe werden.

Zum Thema leichter und praktischer ist ansichtssache. Ist nicht böse gemeint, dir als Anfänger fehlt aber die Erfahrung um das im ganzen beurteilen zu können. Wenn du mal komplexere Queries entwickelst wirst du schnell die Nachteile kennenlernen die sich durch diesen Aufbau ergeben. Aber wie gesagt ist ansichtssache, diese Mini Queries sind in jeder schreibweise noch "leicht".

Hier mal die Probleme/Nachteile die sich aus dieser Schreiweise in meinen Augen ergeben können.
  • Feldliste hintereinander, versuch dir mal ein Überblick zu machen wenn du 30 Felder und mehr brauchst. Das geht vielleicht beim ersten schreiben noch relaitv einfach, schaus dir aber mal nach einem Monat an
  • nichts sagende Tabellen Aliase, warum verständlich wenns auch unverständlich geht? Nur aus schreibfaulheit (oder hat das nen anderne Grund?) macht man aus sowas klaren wie USERDATEN ein d. Was passiert wenn du mal ein paar mehr Tabellen hast... a,b,c,d,e,f,g,h :ugly: (Und am ende ist das ganze im Script total inkonsistent, in dem einen Query ist USERDATEN a in dem anderen b usw...)
  • `, ich hab immer das gefühl mein Monitor ist dreckig :LOL: Kann man machen, aber pflicht ist es nicht. Ich bin damit schonmal schön auf die Fresse gefallen. Reserviertes Wort verwendet mit `` alles kein Problem. Jedoch bin ich irgendwann mal in die unangenehme Situation geraten ein Backup wieder einzuspielen. Aber was war... das Backups war ohne Ticks :ugly: Herzlichen Glückwunsch. Ne 500MB große Datei zu bearbeiten macht spaß. (Backupstrategie war aber eh fürn Arsch)
  • die Join Syntax, kann man für kleine Queries verwenden, aber bei großen wird es unübersichtlich. Bau mal ein Query mit nur 5 Tabellen und einer Bedingung die ein wenig anspruchsvoller ist als "user.user_id = 5". Dann wirst du die Nachteile merken und wenn nicht, spätestens nach einem Monat. Die FROM Klausel ist zwar noch rechtübersichtlich, aber nicht die WHERE. Da muss man dann immer unterscheiden JOIN Bedigung oder "Filter". Von daher kommst du besser wenn du die JOIN bedigung in die FROM Klausel schreibst. Nächstes problem an der stelle wäre auch noch sowas wie ein LEFT JOIN, du müsstest dann die Syntaxe(?) mischen. Auch nicht schön...
  • die ID als id zu bezeichnen ist immer unvorteilhaft. Es wird unübersichtlich wenn man 50 verschiedene IDs hat die alle id heißen. ;) In meinen Augen ist eine user_id klarer als eine id. In der Konstelation User <-> Userdaten ist das zwar kein Problem. Aber was ist wenn man jetzt noch ne Tabelle "bestellungen" dazukommt und die ID der bestellung als id bezeichnet. Da hat man ende solche konstelationen wie bestellungen.user_id = user.id, und nebenbei hat man noch bestellungen.id. Und das ganze mischen wir dann noch mit nem Tabellen Alias und wolla b.user_id = u.id, b.id :ugly:

Bei mir würde der Query so aussehen:
PHP:
SELECT
	user.user_id,
	userdaten.vorname
FROM
	user INNER JOIN
	userdaten ON (user.user_id = userdaten.user_id)
WHERE
	user.user_id = 1
ich schreib selbst sowas wie:
PHP:
SELECT
     bar.foo
FROM
     bar

Wie gesagt das ist meine Meinung und mein Weg. Jeder muss sein eigenen weg finden und klar kommen. Meine Queries sahen auch mal so aus wie
PHP:
SELECT `u`.`id`, `d`.`vorname` FROM `user` AS `u`, `userdaten` AS `d` WHERE `u`.`id`=`d`.`id` AND `u`.`id`=1
ich bin damit aber nicht mehr klar gekommen. Mitlerweile schreib ich sogar Kommentare in manche Queries damit ich nach nem Monat noch verstehe was das soll.
 

  • Feldliste hintereinander: Wenn ich auch mal mehr Felder benutzte sieht es auch anders aus ;) War ja nur ein kl. Beispiel.
  • nichts sagende Tabellen Aliase: Wie oben auch, bei nur 2 Tabellen und so einer kl. Query dürfte das noch okay sein ;)
  • `: Die benutze ich immer, finde ich schöner
  • die Join Syntax: Werde ich mir mal genauer anschaun ;) Bisher habe ich das immer mit , gemacht. (Wie man diese Art auch nennen mag^^)
  • die ID: gebe ich dir Recht.

Und das waren nun meine kl. Antworten aus meinen Augen herraus ;)


PS:
[..]dir als Anfänger[..]
Evtl. fehlt mir noch die Erfahrung, ja, aber die baue ich ja mit der Zeit auf. Aber nen Anfänger bin ich nicht mehr denke ich. Bsp.? Siehe Sig :p (Nein, nicht der Decoder^^)
 
  • nichts sagende Tabellen Aliase: Wie oben auch, bei nur 2 Tabellen und so einer kl. Query dürfte das noch okay sein ;)
Da geht es wohl eher ums Prinzip: Eine Antwort à la "Naja, ich weiß ja wies richtig geht, nur bei so einem Pipifax kann man das mal schnell hinrotzen :ugly:" ist nicht wünschenswert.

ZeroCCC ging es wohl drum, dass du es dir gleich von Anfang an ("als Anfänger") richtig angewöhnst, damit du dich dann nicht später mühsam umgewöhnen musst ;)
 
Evtl. fehlt mir noch die Erfahrung, ja, aber die baue ich ja mit der Zeit auf. Aber nen Anfänger bin ich nicht mehr denke ich. Bsp.? Siehe Sig :p (Nein, nicht der Decoder^^)

War ja auch in keinster art negativ gemeint. Wollt nur sagen dass man seinen Weg selbst durch erfahrung findet und ich bin jetzt einfach nur nachdem gegangen was ich gesehen hab und hab mal meine erfahrungen dazu gepostet. Jeder fängt mal klein an... wie gesagt meine Queries sahen vor ein paar Jahren auch nicht anders aus als das was du gepostet hast.

theHacker schrieb:
ZeroCCC ging es wohl drum, dass du es dir gleich von Anfang an ("als Anfänger") richtig angewöhnst, damit du dich dann nicht später mühsam umgewöhnen musst
Ich wollt nur ein paar Tipps geben... was er wie daraus macht ist ganz ihn überlassen. ;) Wie gesagt das ist Erfahrungssache mal selbst auf Probleme stoßen schadet auch nicht.

theHacker schrieb:
Da geht es wohl eher ums Prinzip
Ja da geht es ums Prinzip ;) Aber das ist so ne Sache die sollte jeder selbst kennenlernen... solche kleine faulheiten wie einmal mach ichs so und einmal so müssen jedem mal selbst auf die Füße fallen. Ich arbeite jetzt so ziemlich genau seit 3 Jahren Hauptberuflich an einem Projekt und hab relativ schnell gelernt das ein so ein scheißdreck schnell auf die füße fallen kann.
 
Zuletzt bearbeitet:
War ja auch in keinster art negativ gemeint. Wollt nur sagen dass man seinen Weg selbst durch erfahrung findet und ich bin jetzt einfach nur nachdem gegangen was ich gesehen hab und hab mal meine erfahrungen dazu gepostet. Jeder fängt mal klein an... wie gesagt meine Queries sahen vor ein paar Jahren auch nicht anders aus als das was du gepostet hast.

Habe ich auch nicht negativ empfunden, man kann ja nicht alles über andere Leute wissen ;)


Ich wollt nur ein paar Tipps geben... was er wie daraus macht ist ganz ihn überlassen. ;) Wie gesagt das ist Erfahrungssache mal selbst auf Probleme stoßen schadet auch nicht.

Jop, danke nochmal. Etwas in dieser Art von weit aus erfahreneren Leuten zu hören kann nicht schaden ;)