Zur Navigation

Join über drei SQL-Tabellen

1 AndiN

Hallo zusammen,

ich versuche gerade einen JOIN über drei Tabellen.
Für mich sieht es so aus als wäre meine WHERE-Anweisung im SELECT falsch. Wie im SQL-Script zu sehen ist, gebe ich die Daten in html-Zeilen aus. Momentan ist es so, dass er mir 79 Zeilen ausgibt (79 Einträge stehen in der Datenbank drin) allerdings sind diese Zeilen alle leer. Mal davon abgesehen, dass die Zeilen leer sind sollten es laut SELECT-Abfrage nur 6 Zeilen sein die ausgegeben werden.

Über Hilfe wäre ich sehr dankbar.

Meine SQL-Anweisung sieht folgendermaßen aus:

$sql = mysql_connect($host_porta,$user_porta,$pword_porta);
mysql_select_db($db_porta,$sql);
$sql = "SELECT t1.praxisname,t1.vorname,t1.ort1,t1.ort2,t1.name1,t1.name2,t1.plz,t1.strasse,t1.telefon1,t1.telefon2,t1.fax,t1.email,t1.domain,t1.link,t1.heilverfahren,t1.qualifikationen,t1.bild,t2.land,t3.state FROM suchdaten AS t1,geo_countries AS t2,geo_states AS t3 WHERE t1.id=16466 OR t1.id=16466 OR t1.id=16559 OR t1.id=16559 OR t1.id=17900 OR t1.id=17900 && t1.bundesland = t3.id && t1.land = t2.cou_id ORDER BY t1.plz,t1.name1 ASC";
$connect = mysql_query($query) or die(mysql_error());
while($val = mysql_fetch_object($connect))
{
	$Praxisname = $val -> praxisname;
	$Vorname = $val -> vorname;
	$Ort1 = $val -> ort1;
	$Ort2 = $val -> ort2;
	$Bundesland = $val -> state;
	$Land = $val -> land;
	$Name1 = $val -> name1;
	$Name2 = $val -> name2;
	$PLZ = $val -> plz;
	$Strasse = $val -> strasse;
	$Tel1 = $val -> telefon1;
	$Tel2 = $val -> telefon2;
	$Fax = $val -> fax;
	$Email = $val -> email;
	$Domain = $val -> domain;
	$Link = $val -> link;
	$Heilverfahren = $val -> heilverfahren;
	$Qualifikationen = $val -> qualifikationen;
	$Bild = $val -> bild;

	echo "<tr><td>".$Praxisname."</td><td>".$Vorname."</td></tr>"; // beispielhafte Datenausgabe.
}

Mein Datenbank-Layout sieht folgendermaßen aus:
--
-- Tabellenstruktur für Tabelle `geo_countries`
--

CREATE TABLE IF NOT EXISTS `geo_countries` (
`id` int(8) NOT NULL auto_increment,
`num` varchar(8) default NULL,
`domain` varchar(8) default NULL,
`land` varchar(40) default NULL,
`countries` varchar(40) default NULL,
`countries_long` varchar(80) default NULL,
`iso` varchar(8) default NULL,
`ioc` varchar(8) default NULL,
`ort` varchar(80) default NULL,
`kont` varchar(80) default NULL,
PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=191 ;

--
-- Tabellenstruktur für Tabelle `geo_states`
--

CREATE TABLE IF NOT EXISTS `geo_states` (
`id` int(11) NOT NULL auto_increment,
`cou_id` int(3) NOT NULL default '0',
`state` tinytext NOT NULL,
PRIMARY KEY  (`id`)) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=17 ;

--
-- Tabellenstruktur für Tabelle `suchdaten`
--

CREATE TABLE IF NOT EXISTS `suchdaten` (
`ID` int(11) NOT NULL auto_increment,
`branche` tinytext NOT NULL,
`praxisname` tinytext NOT NULL,
`vorname` tinytext NOT NULL,
`name1` tinytext NOT NULL,
`name2` tinytext NOT NULL,
`plz` tinytext NOT NULL,
`ort1` tinytext NOT NULL,
`ort2` tinytext NOT NULL,
`bundesland` tinytext NOT NULL,
`land` tinytext NOT NULL,
`strasse` tinytext NOT NULL,
`telefon1` tinytext NOT NULL,
`telefon2` tinytext NOT NULL,
`fax` tinytext NOT NULL,
`email` tinytext NOT NULL,
`domain` tinytext NOT NULL,
`heilverfahren` text NOT NULL,
`qualifikationen` text NOT NULL,
`bild` tinytext NOT NULL,
PRIMARY KEY  (`ID`),FULLTEXT KEY `name2` (`name2`)) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=80 ;

25.11.2009 12:01

2 AndiN

Hallo zusammen,

manchmal sieht man den Wald echt vor lauter Bäumen nicht. Die Abfrage muss natürlich so heißen:

$sql = mysql_connect($host_porta,$user_porta,$pword_porta);
mysql_select_db($db_porta,$sql);
$query = "SELECT t1.praxisname,t1.vorname,t1.ort1,t1.ort2,t1.name1,t1.name2,t1.plz,t1.strasse,t1.telefon1,t1.telefon2,t1.fax,t1.email,t1.domain,t1.link,t1.heilverfahren,t1.qualifikationen,t1.bild,t2.land,t3.state FROM suchdaten AS t1 JOIN geo_countries AS t2 ON t1.land = t2.id JOIN geo_states AS t3 ON t1.bundesland = t3.id WHERE t1.id=16466 OR t1.id=16466 OR t1.id=16559 OR t1.id=16559 OR t1.id=17900 OR t1.id=17900 ORDER BY t1.plz,t1.name1 ASC";
$connect = mysql_query($query) or die(mysql_error());
while($val = mysql_fetch_object($connect))
{
.....
}

Wobei ich jetzt den Spass habe, dass NUR Einträge ausgegeben werden bei denen in der Tabelle "suchdaten" das Feld "land" sowie das Feld "bundesland" belegt ist.

Wie kriege ich hin, dass er Folgendes macht:

"Gebe mir alle Einträge aus der Tabelle "suchdaten" aus bei denen die id = eine der geforderten Zahlen ist. Wenn das Feld "land" sowie "bundesland" einen Wert hat, dann ziehe dir aus den Tabellen "geo_countries" und "geo_states" den ensprechenden Wert vom Feld "name" raus. Ansonsten gebe einfach einen leeren Wert raus für die beiden EInträge."

26.11.2009 12:14

3 Rudy

SELECT t1.praxisname,t1.vorname,t1.ort1,t1.ort2,t1.name1,t1.name2,t1.plz,t1.strasse,t1.telefon1,t1.telefon2,t1.fax,t1.email,t1.domain,t1.link,t1.heilverfahren,t1.qualifikationen,t1.bild,t2.land,t3.state 
FROM suchdaten AS t1 
LEFT JOIN geo_countries AS t2 ON t1.land = t2.id 
LEFT JOIN geo_states AS t3 ON t1.bundesland = t3.id 
WHERE t1.id=16466 OR t1.id=16466 OR t1.id=16559 OR t1.id=16559 OR t1.id=17900 OR t1.id=17900 ORDER BY t1.plz,t1.name1 ASC

So kommt für t2.land und t3.state NULL wenn keine verbundenen Daten existieren.

26.11.2009 18:49

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]