PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe zu inner join


9536
17.10.2003, 17:53:40
Bitte um Hilfe,

wer kann mir bei Mysql mit "inner join" helfen. Ich habe 2 Tabellen:

Tabelle 1:
kundennummer name plz wohnort strasse

Tabelle 2:
kundennummer artikel menge


Ich möchte nun in einer Ausgabeliste:

-name plz wohnort strasse artikel menge- ausgeben.

Kann mir bitte jemand einen Tip geben?
Muss ein bestehendes Script umändern, sonst hätte ich alles in eine
Tabelle gepackt.

Danke

lindic
17.10.2003, 18:17:38
ok, ich versuchs mal ohne 'inner join':

SELECT a.name, a.plz, a.wohnort, a.strasse, b.artikel, b.menge FROM tabelle1 a, tabelle2 b WHERE a.kundennummer=b.kundennummer

für tabelle1 und tabelle2 musst du natürlich noch die richtigen namen einsetzen.


gruß,
lindic

9536
17.10.2003, 18:35:12
Wusste garnicht das das auch so geht!!!!!
Prima, nochmals danke.

MiH
20.10.2003, 11:46:02
ganz schlechtes beispiel! so muß jeder datensatz durchsucht werden und kann nicht schon im voraus von mysql außer acht gelassen werden, wie es bei inner join passiert.hier die bessere lösung:
1. Tabelle "Kundendaten"
2. Tabelle "Artikel"

select kundendaten.name,kundendaten.wohnort,kundendaten.plz,kundendaten.stras se,artikel.name,count(artikel.qty) anzahl from kundendaten inner join artikel using(kundennummer) where kundendaten.kundennummer = 1 group by artikel.name;

Nev
20.10.2003, 12:14:45
@MiH

das Inner Join sollte er aber nur benutzen wenn, er alle Kunden haben will, egal ob sie schon was bestellt haben oder ned.

Wenn du nur die User haben willst, die was bestellt haben, wäre es so besser:
SELECT kunde.*, artikel.artikel, artikel.menge
FROM kundendaten as kunde
LEFT JOIN artikel
ON (kunde.kundennummer = artikel.kundennummer)

MiH
20.10.2003, 12:55:35
oh nein, das ist leider falsch NEV.
LEFT JON liefert dir ALLE datensätze zurück, die in der linken tabelle vorhanden sind. fehlt dieser in der rechten tabelle so wird NULL zurück geliefert.


SELECT kunde.*, artikel.artikel, artikel.menge
FROM kundendaten as kunde
LEFT JOIN artikel
ON (kunde.kundennummer = artikel.kundennummer)

liefetr also jeden kunden, egal ob er was bestellt hat oder nicht. nur entweder kommt ein ergebnis oder das ergebnis ist NULL!

bei inner join werden nur die datensätze zurück geliefert, die in beiden tabellen vorkommen. das sind eben die unterschiede ;) aber diese sollte man schon kennen.

Nev
20.10.2003, 13:01:31
@MiH

stimmt hast recht, hab ich mich vertan!
BIG SORRY

Ich könnt jetzt a Ausrede ausdenken, aber ich glaube ich darf mich mal vertun. *fg*

da-wandler
10.02.2004, 10:05:56
$Such_Artikel = mysql($db,"SELECT art.*, kunden_preise.ArtikelNr,kunden_preise.MaterialNr FROM artikel as art LEFT JOIN kunden_preise ON (art.artikelnr = kunden_preise.ArtikelNr) WHERE artikelnr LIKE '%$suche%' OR suchbegriff LIKE '%$suche%' OR bezeichnung LIKE '%$suche%' OR bezeichnung2 LIKE '%$suche%' OR (KundenNr ='".$_SESSION["KundenNr"]."' AND MaterialNr LIKE '%$suche%')");

Hm...ich hoffe mal gleich wird es übersichtlicher..

Ich habe eure kommentare bzgl. der joins versucht umzusetzen scheitere allerdings bei where

ich habe folgendes vor:
ein suche soll artikel-daten aus der stamm-tabelle (artikel)liefern gleichzeitig soll eine individuelle kundentabelle mitdurchsucht werden (einige kunden benutzen andere artikelnummern = Materialnummer)

das ganze funktioniert prima, wenn ich nur ein OR habe (also z.b. bezeichung aus tab1 und materailnr in kombination mit kundennr aus tab2) wenn ich aber mehrere OR eingaben mache gibt´s nen error

PS: gibt es irgendwo ein tutorial zu joins? ehrlich gesagt versteh ich left/right/inner Using ON nämlich nicht wirklich...

besten dank, vorab!

da-wandler
10.02.2004, 14:56:49
ok habs jetzt...

ich musste in den OR´s natürlich auch angeben, welche tabelle genommen werden mus...:-)

wenn trotzdem noch jemand nen tipp bzgl. tutorial join .. wäre nicht abgeneigt...

ps: war mein frage eigentlich so blöd, unverständlich ..das niemand reagiert hat?

Nev
10.02.2004, 15:02:56
Hi da-wandler

Erstmal Willkommen auf SelfPHP

ES GIBT KEINE BLÖDEN FRAGEN!! ;-)

Wegen der Reaktions-Zeit:
Die meisten hier sind Schüler (sorry wenn sich jetzt jemand auf den Schlipps getretten fühlt)
das heißt das sie ned gerade schnell antworten können.

Die anderen die Arbeiten, haben auch ständig was zu tun.

So kann es generell zu verzögerungen bei den Antworten kommen.


Wegen den Joins.
schau mal auf die Mysql-Seite (http://www.mysql.de).
Solltest was finden.

da-wandler
10.02.2004, 15:53:55
>>Willkommen

Danke!

>>mysql.de

habe ich natürlich schon geschaut, aber nicht ganz geblickt...
das ist echt blöd, wenn man sich das selbst beibringt sieht man oft den wald vor lauter ....

da-wandler
12.02.2004, 14:44:11
meine datenbankabfrage mit dem left join hat doch einen hacken..
und zwar will ich ja aus tab 1 daten herausholen, wenn bedingung 1 erfüllt ist und aus tab2 wenn bedingung 2 erfüllt ist...nur hab ich jetzt erst gemerkt, dass er aus tab2 trotzdem die daten heraus holt, weil bedingung 1 (von tab1) erfüllt ist!


$Such_Artikel = mysql($db,"SELECT art.*, kunden_preise.ArtikelNr,kunden_preise.MaterialNr FROM artikel as art LEFT JOIN kunden_preise ON (art.artikelnr = kunden_preise.ArtikelNr) WHERE art.artikelnr LIKE '%$suche%' OR art.suchbegriff LIKE '%$suche%' OR art.bezeichnung LIKE '%$suche%' OR art.bezeichnung2 LIKE '%$suche%' OR (kunden_preise.KundenNr ='".$_SESSION["KundenNr"]."' AND kunden_preise.MaterialNr LIKE '%$suche%')");


also konkret:
ich bekomme für kunden_preise.ArtikelNr einen wert weil art.artikelnr LIKE '%$suche%' erfüllt ist!

Kann das sein?

Beste Grüße

da-w

da-wandler
12.02.2004, 16:02:00
Ich habs...aber wohl um zwei drei umwege...
entscheidend ist wohl das Group by (mir ist/war der unterschied zu Order by nicht ganz klar)
es löscht aber alle doppelten datensätze

später schau ich dann halt nochmal ob der user diesen datensatz überhaupt sehen darf..

wenn du dennoch eine alternative hast würde sie mich interessieren!

speziell was wird eigentlich bei meinem join gemacht?!

werden beim join die spalten von tab 2 in die tab1 integriert?