oxford
Anmeldungsdatum: 7. Februar 2009
Beiträge: 125
|
Habe ein Problem mit INNER JOIN, ich will 2 Tabellen zusammen führen.
Hier erstmal ein Beispiel das ich im Netz gefunden habe und nachdem ich mich orientiert habe: SELECT RechnungsNr, KundenNr, Betrag, Rechnungen_Oktober.Kartennummer, Firma, Inhaber, Ablaufdatum FROM Kreditkarte INNER JOIN Rechnungen_Oktober ON Kreditkarte.Kartennummer = Rechnungen_Oktober.Kartennummer Jetzt kommt mein SQL:
SELECT Red_F_T_Pro_ID, Inhalt, Email, Send_Email, Timecode_Email, Inhalt, Artikeltext, Branchentext, Branchentext_Alle, T_Titel_NrJ.T_Titel_NrJ_ID
FROM T_Artikel
INNER JOIN T_Titel_NrJ ON ( T_Artikel.Titel_NrJ_ID = T_Titel_NrJ.Titel_NrJ_ID )
WHERE Email LIKE "%27985%"
OR Red_F_T_Pro_ID LIKE "27985"
ORDER BY Red_F_T_Pro_ID DESC
LIMIT 10 Hier die Fehler Meldung:
#1054 - Unknown column 'T_Titel_NrJ.T_Titel_NrJ_ID' in 'field list'
PS: Die Tabellen, sowie Spalten sind alle 100% so benannt und vorhanden.
|
frabron
Anmeldungsdatum: 11. Februar 2007
Beiträge: 151
|
Sicher das du eine Tabelle "T_Titel_NrJ" hast? Die Syntax in deinem Join sollte lauten "... ON ... = Tabelle.Spalte ..." Bei sowas bietet sich die Arbeit mit Aliasen an, dann kommt man auch nicht so schnell durcheinander 😉
|
oxford
(Themenstarter)
Anmeldungsdatum: 7. Februar 2009
Beiträge: 125
|
Ja bin ich mir 100% sicher! Habe die gleiche Abfrage mal anstatt mit JOIN mit WHERE gebaut.
genau der gleiche Fehler SELECT a.Red_F_T_Pro_ID, a.Inhalt, a.Email, a.Send_Email, a.Timecode_Email, a.Inhalt, a.Artikeltext, a.Branchentext, a.Branchentext_Alle, b.T_Titel_NrJ_ID
FROM T_Artikel a, T_Title_NrJ b
WHERE (a.Titel_NrJ_ID = b.T_Titel_NrJ_ID)
AND a.Email LIKE "%27985%"
OR a.Red_F_T_Pro_ID LIKE "27985"
ORDER BY a.Red_F_T_Pro_ID DESC
LIMIT 10
#1146 - Table 'datenbankname_xy.T_Title_NrJ' doesn't exist Hier eine Abfrage die PHPMYADMIN ausführt wenn ich in der Tabelle T_Titel_NrJ absteigend sortiere SELECT *
FROM `T_Titel_NrJ`
ORDER BY `T_Titel_NrJ`.`Titel_NrJ_ID` ASC
LIMIT 0 , 30 Abfrage funktioniert , es werden 30 Datensätze ausgegeben.
- Bilder
|
frabron
Anmeldungsdatum: 11. Februar 2007
Beiträge: 151
|
Bist du dir sicher, dass die Klammern in der Join Bedingung richtig sind? Ich benutze nur Postgresql, deshalb weiss ich es nicht genau, aber wenn ich mir das Handbuch zu JOINs so ansehe, gehören die erst mal nicht dahin, sondern nur wenn man sowas macht | SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)
|
Dein erstes Beispiel hat die Klammern auch nicht. Schau auch mal ins Handbuch zu JOINs http://dev.mysql.com/doc/refman/5.0/en/join.html
|
oxford
(Themenstarter)
Anmeldungsdatum: 7. Februar 2009
Beiträge: 125
|
SELECT a.Red_F_T_Pro_ID, a.Inhalt, a.Email, a.Send_Email, a.Timecode_Email, a.Inhalt, a.Artikeltext, a.Branchentext, a.Branchentext_Alle, b.T_Titel_NrJ_ID
FROM T_Artikel a
LEFT JOIN T_Title_NrJ b ON ( a.Titel_NrJ_ID = b.T_Titel_NrJ_ID )
WHERE a.Email LIKE "%27985%"
OR a.Red_F_T_Pro_ID LIKE "27985"
ORDER BY a.Red_F_T_Pro_ID DESC
LIMIT 10 oder SELECT a.Red_F_T_Pro_ID, a.Inhalt, a.Email, a.Send_Email, a.Timecode_Email, a.Inhalt, a.Artikeltext, a.Branchentext, a.Branchentext_Alle, b.T_Titel_NrJ_ID
FROM T_Artikel a
LEFT JOIN T_Title_NrJ b ON a.Titel_NrJ_ID = b.T_Titel_NrJ_ID
WHERE a.Email LIKE "%27985%"
OR a.Red_F_T_Pro_ID LIKE "27985"
ORDER BY a.Red_F_T_Pro_ID DESC
LIMIT 10 kommt auf selbe hinaus, daran liegts nicht.
Kapier ich alles irgendwie nicht da die Tab und die Spalte ja vorhanden sind.
|
frabron
Anmeldungsdatum: 11. Februar 2007
Beiträge: 151
|
Die beiden Spalten sind auch vom selben Typ? Ansonsten gib mal nen Dump (Struktur) beider Tabellen, damit das mal nachvollziehbarer wird.
|
oxford
(Themenstarter)
Anmeldungsdatum: 7. Februar 2009
Beiträge: 125
|
Ja, sind beide vom Typ int(11) Hier die Strucktur:
- Bilder
|
frabron
Anmeldungsdatum: 11. Februar 2007
Beiträge: 151
|
Vielleicht Probleme mit der Groß/Kleinschreibung der Spaltennamen? In Postgresql werden Spaltennamen immer als lowercase angesprochen, will man Groß/Kleinschreibung beachten, muss man den Spaltennamen maskieren. Hast du es mit den Backticks von Mysql schon mal probiert? PHPMyAdmin machts ja auch. Evt. von dem Query mal die Backticks entfernt und geschaut, was passiert? Ansonsten habe ich nur noch den Tipp, den Query so weit zu vereinfachen, bis es geht und dann nach und nach wieder aufbauen.
|
melc
Anmeldungsdatum: 28. Dezember 2008
Beiträge: Zähle...
Wohnort: Karlsruhe
|
oxford schrieb: Ja bin ich mir 100% sicher!
Vielleicht versteh ich das Problem nicht, aber hat sich die angehängten Bilder jemand nur ein einziges Mal angeschaut? Ich kann dort keine Tabelle namens T_Title_NrJ sehen, sondern nur eine namens T_Titel_NrJ. Und eine Spalte T_Titel_NrJ_ID gibst da auch nicht.
|
oxford
(Themenstarter)
Anmeldungsdatum: 7. Februar 2009
Beiträge: 125
|
SELECT a.Red_F_T_Pro_ID, a.Inhalt, a.Email, a.Send_Email, a.Timecode_Email, a.Inhalt, a.Artikeltext, a.Branchentext, a.Branchentext_Alle, b.Titel_NrJ_ID
FROM T_Artikel a
LEFT JOIN T_Titel_NrJ b ON ( a.Titel_NrJ_ID = b.Titel_NrJ_ID )
WHERE a.Email LIKE "%27985%"
OR a.Red_F_T_Pro_ID LIKE "27985"
ORDER BY a.Red_F_T_Pro_ID DESC
LIMIT 10 work!
Fehler war tatsächlich der Spalten Namen "T_" (kp wieso der mir da so rein gerutscht ist).
Manchmal sieht man vor lauter Wald die Bäume nicht.
Danke ☺
|
oxford
(Themenstarter)
Anmeldungsdatum: 7. Februar 2009
Beiträge: 125
|
Da die Joins jetzt funktionieren habe ich die Abfrage noch weiter ausgebaut.
Soweit funktioniert auch alles so wie es soll.
Allerdings soll die ID (a.Red_F_T_Pro_ID) nur einmalig vorkommen, daher habe ich ein DISTINCT davor gesetzt, was allerdings nicht funktioniert. Hier der Codeblock: SELECT DISTINCT a.Red_F_T_Pro_ID, a.Inhalt, a.Email, a.Send_Email, a.Timecode_Email, a.Inhalt, a.Artikeltext, a.Branchentext, a.Branchentext_Alle, c.Titel, e.Lang_Br, f.NrJ
FROM T_Artikel a
LEFT JOIN T_Titel_NrJ b ON ( a.Titel_NrJ_ID = b.Titel_NrJ_ID )
LEFT JOIN T_Titel c ON ( b.Titel = c.Titel_ID )
LEFT JOIN T_Branchen_Artikel d ON ( a.Red_F_T_Pro_ID = d.Artikel_ID )
LEFT JOIN T_Branchen e ON ( d.Branchen_ID = e.Branchen_ID )
LEFT JOIN T_NrJ f ON ( b.NrJ_ID = f.NrJ_ID )
WHERE a.Email LIKE "%79%"
OR Red_F_T_Pro_ID LIKE "79"
ORDER BY Red_F_T_Pro_ID DESC
LIMIT 10 Im Anhang findet ihr ein Screenshot der Ausgabe
- Bilder
|
frabron
Anmeldungsdatum: 11. Februar 2007
Beiträge: 151
|
Ich vermute, das geht nicht weil in Lang_br noch unterschiedliche Werte drin sind - weiter wird Mysql die Datensätze nicht zusammenfassen können.
|
oxford
(Themenstarter)
Anmeldungsdatum: 7. Februar 2009
Beiträge: 125
|
Kann man den QRY nicht so umschreiben das genau sowas nicht Auftritt?
Dachte genau für solche Fälle wäre DISTINCT gedacht.
|
frabron
Anmeldungsdatum: 11. Februar 2007
Beiträge: 151
|
Lass die Spalte weg oder benutze Aggregate Funktionen. Evt. solltest du dich fragen, was du genau mit deinem Query abfragen möchtest und ob dein Datenmodell den Query zulässt - Stichwort Normalisierung. Es ist oft besser, kleinere Queries anstatt eines Riesenqueries zu machen. Das ist jetzt aber nur ein Schuss ins Blaue, ich kenne ja weder deine Datenbank, noch was du mit der Abfrage herausbekommen willst 😉 ☺
|
oxford
(Themenstarter)
Anmeldungsdatum: 7. Februar 2009
Beiträge: 125
|
Jop mit Spalte weg lassen geht es. Habe gerade noch einen anderen Fehler gefunden.
Dieser SQL geht.
SELECT DISTINCT a.Red_F_T_Pro_ID, a.Inhalt, a.Email, a.Send_Email, a.Timecode_Email, a.Artikeltext, a.Branchentext, a.Branchentext_Alle, c.Titel, f.NrJ
FROM T_Artikel a
LEFT JOIN T_Titel_NrJ b ON ( a.Titel_NrJ_ID = b.Titel_NrJ_ID )
LEFT JOIN T_Titel c ON ( b.Titel = c.Titel_ID )
LEFT JOIN T_Branchen_Artikel d ON ( a.Red_F_T_Pro_ID = d.Artikel_ID )
LEFT JOIN T_Branchen e ON ( d.Branchen_ID = e.Branchen_ID )
LEFT JOIN T_NrJ f ON ( b.NrJ_ID = f.NrJ_ID )
WHERE a.Email IS NULL AND Send_Email IS NULL
LIMIT 10 Sobald ich aber nach irgend etwas Sortieren möchte.
z.b. ORDER BY Red_F_T_Pro_ID
wird der SQL nicht ausgeführt, ich bekomme auch keine Fehlermeldung sondern die MYSQL Datenbank schmiert mehr oder weniger komplett ab.
Es kann erst wieder drauf zugegriffen werden nachdem ich den MYSQL Server neu gestartet habe (sudo /etc/init.d/mysql restart) SELECT DISTINCT a.Red_F_T_Pro_ID, a.Inhalt, a.Email, a.Send_Email, a.Timecode_Email, a.Artikeltext, a.Branchentext, a.Branchentext_Alle, c.Titel, f.NrJ
FROM T_Artikel a
LEFT JOIN T_Titel_NrJ b ON ( a.Titel_NrJ_ID = b.Titel_NrJ_ID )
LEFT JOIN T_Titel c ON ( b.Titel = c.Titel_ID )
LEFT JOIN T_Branchen_Artikel d ON ( a.Red_F_T_Pro_ID = d.Artikel_ID )
LEFT JOIN T_Branchen e ON ( d.Branchen_ID = e.Branchen_ID )
LEFT JOIN T_NrJ f ON ( b.NrJ_ID = f.NrJ_ID )
WHERE a.Email IS NULL AND Send_Email IS NULL
ORDER BY Red_F_T_Pro_ID
LIMIT 10 In der Datenbank sind etwa 30.000 Einträge, meine Vermutung ist jetzt das es einfach zu viel für den MYSQL Server wird wenn er sie auch noch sortieren muss O_o
anders kann ich es mir nicht erklären, da der selbe QRY ohne ORDER ja einbandfrei funktioniert.
|