flotschi301: MySQL Adressbuch mit zwei Anschriften

ich habe ein Adressbuch unter Mysql angelegt in dem zwei anschriften hinterlegt sind.
Die Orte habe ich in einer separaten Tabelle eingetragen und mit einem LEFT JOIN verbunden.
Dies funktioniert aber leider nur für die eine Adresse, nicht für die zweite.
Wenn ich einen zeiten LEFT JOIN einfüge bekomme ich den Fehler, dass der Wert "Orte" unique ist.

  
<html>  
<head>  
<title>Adressen</title>  
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">  
</head>  
<body>  
<?php  
error_reporting(E_ALL);  
require_once ('config_adresse.php');  
  
mysql_connect(MYSQL_HOST,MYSQL_BENUTZER,MYSQL_KENNWORT ) or  
		die("Keine Verbindung möglich: " . mysql_error());  
mysql_select_db(MYSQL_DATENBANK) or  
		die("Auswahl der Datenbank fehlgeschlagen");  
$abfrage = "SELECT *  
			FROM adressen  
			LEFT JOIN orte ON adressen.plzgew = orte.plz  
			WHERE adressen.plzgew = orte.plz  
			LEFT JOIN orte ON adressen.plzpriv = orte.plz  
			ORDER BY nachname";  
$ergebnis = mysql_query($abfrage);  
	$res = mysql_query("SELECT nachname FROM adressen");  
	$num = mysql_num_rows($res);  
  
	echo "<table border=\"0\" width=\"2800\">";  
	echo "<tr bgcolor=\"E1E8F1\" class=\"tablehead\">";  
	echo "<td>ID</td>";  
	echo "<td>Nachname</td>";  
	echo "<td>Vorname</td>";  
	echo "<td>Firma</td>";  
	echo "<td>Strasse gew.</td>";  
	echo "<td>PLZ gew.</td>";  
	echo "<td>Ort gew.</td>";  
	echo "<td>Tel. gew.</td>";  
	echo "<td>Mobil gew.</td>";  
	echo "<td>Fax gew.</td>";  
	echo "<td>Strasse priv.</td>";  
	echo "<td>Plz priv.</td>";  
	echo "<td>Ort priv.</td>";  
	echo "<td>Tel. priv.</td>";  
	echo "<td>Mobil priv.</td>";  
	echo "<td>Fax priv.</td>";  
	echo "<br>";  
	echo "</tr>";  
	echo "</table>";  
  
	echo "<tr><td colspan=\"15\">Anzahl Einträge in der Datenbank: ";  
	echo $num;  
	echo "<td></tr>";  
	echo "</table>";  
  
while ($row = mysql_fetch_array( $ergebnis, MYSQL_ASSOC)) {  
	$data[] = $row;  
}  
	echo "<table border=\"0\">";  
foreach($data as $key => $value) {  
?>  
  
	<?php if(($key % 2) == 1) { ?>  
	<tr bgcolor="FFFFFF">  
	<?php } else { ?>  
	<tr bgcolor="E1E8F1">  
	<?php } ?>  
  
	<td><?php echo $value['id']; ?></td>  
	<td><?php echo $value['nachname']; ?></td>  
	<td><?php echo $value['vorname']; ?></td>  
	<td><?php echo $value['firma']; ?></td>  
	<td><?php echo $value['strassegew']; ?></td>  
	<td><?php echo $value['plzgew']; ?></td>  
	<td><?php echo $value['ort']; ?></td>  
	<td><?php echo $value['telgew']; ?></td>  
	<td><?php echo $value['mobilgew']; ?></td>  
	<td><?php echo $value['faxgew']; ?></td>  
	<td><?php echo $value['strassepriv']; ?></td>  
	<td><?php echo $value['plzpriv']; ?></td>  
	<td><?php echo $value['ort']; ?></td>  
	<td><?php echo $value['telpriv']; ?></td>  
	<td><?php echo $value['mobilpriv']; ?></td>  
	<td><?php echo $value['faxpriv']; ?></td>  
	</tr>  
  
<?php } ?>  
  
<?php  
echo "</table>";  
?>  
</body>  
</html>  

  1. Hi,

    Wenn ich einen zeiten LEFT JOIN einfüge bekomme ich den Fehler, dass der Wert "Orte" unique ist.

    Tatsächlicher Wortlaut der Fehlermeldung …?

    Ich vermute eher sowas wie “each derived table must have it’s own alias” … wenn das der Fall sein sollte: Dann gebe ihnen Aliase.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Hi,

      Wenn ich einen zeiten LEFT JOIN einfüge bekomme ich den Fehler, dass der Wert "Orte" unique ist.

      Tatsächlicher Wortlaut der Fehlermeldung …?

      Ich vermute eher sowas wie “each derived table must have it’s own alias” … wenn das der Fall sein sollte: Dann gebe ihnen Aliase.

      MfG ChrisB

      Bei folgender Abfrage

      SELECT * FROM adressen  
      LEFT JOIN orte ON adressen.plzgew = orte.plz  
      LEFT JOIN orte ON adressen.plzpriv = orte.plz
      

      erhalte ich diesen Fehler:
      #1066 - Not unique table/alias: 'orte'

      1. Hi,

        Bei folgender Abfrage

        SELECT * FROM adressen

        LEFT JOIN orte ON adressen.plzgew = orte.plz
        LEFT JOIN orte ON adressen.plzpriv = orte.plz

        
        >   
        > erhalte ich diesen Fehler:  
        > #1066 - Not unique table/alias: 'orte'  
          
        Na ja, nah genug dran an dem, was ich vermutet hatte.  
          
        Also: Vergebe unterschiedliche Aliase …  
          
        MfG ChrisB  
          
        
        -- 
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        
        1. Hi,

          Bei folgender Abfrage

          SELECT * FROM adressen

          LEFT JOIN orte ON adressen.plzgew = orte.plz
          LEFT JOIN orte ON adressen.plzpriv = orte.plz

          
          > >   
          > > erhalte ich diesen Fehler:  
          > > #1066 - Not unique table/alias: 'orte'  
          >   
          > Na ja, nah genug dran an dem, was ich vermutet hatte.  
          >   
          > Also: Vergebe unterschiedliche Aliase …  
          >   
          > MfG ChrisB  
          >   
          >   
          
          kannst du mir das nnäher erklären? ich bin noch totaler noob auf dem gebiet und meine suchen im internet waren bisher erfolglos...
          
          1. orte und orte sind der gleiche Name. das "= orte.plz" weiß nicht worauf es sich beziehen soll.
            Schreib
            SELECT * FROM adressen
            LEFT JOIN orte o1 ON adressen.plzgew = o1.plz
            LEFT JOIN orte o2 ON adressen.plzpriv = o2.plz

            1. orte und orte sind der gleiche Name. das "= orte.plz" weiß nicht worauf es sich beziehen soll.
              Schreib
              SELECT * FROM adressen
              LEFT JOIN orte o1 ON adressen.plzgew = o1.plz
              LEFT JOIN orte o2 ON adressen.plzpriv = o2.plz

              das war schonmal ein Ergebnis... danke dafür. Nun habe ich versucht dies in mein php-scrip einzubauen, scheitere baer an der korrekten rückgabe des wertes "ort". Bei Eingabe von "Ort" als Rückgabeindex erscheint bei beiden Einträgen derselbe Wert (ist ja auch logisch). Nun habe ich versucht, alle möglichen KOmbinationen des oben genannten o1/o2 mit in den Wert "ort" einzubauen... bekomme aber immer dir Rückmeldung "undefined index"
              kann ich euch noch einmal bemühen?

              1. Tach!

                Bei Eingabe von "Ort" als Rückgabeindex erscheint bei beiden Einträgen derselbe Wert (ist ja auch logisch).

                Beide Einträge? Es gibt nur ein $foo['bar'] auch wenn du zweimal was reinschreibst.

                Nun habe ich versucht, alle möglichen KOmbinationen des oben genannten o1/o2 mit in den Wert "ort" einzubauen... bekomme aber immer dir Rückmeldung "undefined index"
                kann ich euch noch einmal bemühen?

                Auch da helfen Aliase. Du musst nur mindestens diese beiden Felder konkret angeben und nicht hoffen, dass der * es richtig macht. Außerdem musst du nicht rumraten sondern kannst dir mit print_r() oder var_dump() anzeigen lassen, was dir die Fetch-Funktion zurückgibt.

                dedlfix.

              2. Moin!

                orte und orte sind der gleiche Name. das "= orte.plz" weiß nicht worauf es sich beziehen soll.
                Schreib
                SELECT * FROM adressen
                LEFT JOIN orte o1 ON adressen.plzgew = o1.plz
                LEFT JOIN orte o2 ON adressen.plzpriv = o2.plz

                Dein Datenmodell ist leider fehlerhaft.

                Du denkst, die Postleitzahl wäre einmalig und eindeutig, so dass du anhand der PLZ immer genau einen Ortsnamen bekommst.

                Das ist FALSCH! Einunddieselbe PLZ kann durchaus zu MEHREREN Ortsnamen gehören, und es ist für die Postzustellung notwendig, dass man den Ort separat angibt.

                Beispielsweise gehört die PLZ 26835 zu sechs Orten: http://www.plz-postleitzahl.de/land.niedersachsen/plz-26835.html

                Dir bleibt nichts anderes übrig, als den Ortsnamen mit in deinen Datensatz zu speichern. Dann sparst du dir aber auch jeden Subrequest oder Join.

                - Sven Rautenberg

                1. Moinsen!

                  Das ist FALSCH! Einunddieselbe PLZ kann durchaus zu MEHREREN Ortsnamen gehören, und es ist für die Postzustellung notwendig, dass man den Ort separat angibt.

                  Kann? Diese scheiss Teile gehören sogar Orten in unterschiedlichen Bundesländern. Was die Post mit den PLZ macht ist nur Mist. Scheinbar können sich Mitarbeiter der Post heutzutage nur eine PLZ merken in der sie zustellen...

                  --
                  Signaturen sind blöd!
                  1. Hi,

                    Das ist FALSCH! Einunddieselbe PLZ kann durchaus zu MEHREREN Ortsnamen gehören, und es ist für die Postzustellung notwendig, dass man den Ort separat angibt.
                    Kann? Diese scheiss Teile gehören sogar Orten in unterschiedlichen Bundesländern.

                    Kannst Du dafür bitte ein oder zwei Beispiel-PLZ nennen?

                    Was die Post mit den PLZ macht ist nur Mist.

                    Die haben die POST-Leitzahlen halt nach den Bedürfnissen der Post vergeben, nicht nach den Bedürfnissen von Verwaltungen ...

                    Ich hatte mal die Gelegenheit, eine Führung in einem Post-Verteilzentrum (München, in der ehemaligen Paketposthalle), mitzumachen. War sehr interessant, die Verteilmaschinen bei der Arbeit zu sehen!

                    cu,
                    Andreas

                    --
                    Warum nennt sich Andreas hier MudGuard?
                    O o ostern ...
                    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
                    1. Hi,

                      Das ist FALSCH! Einunddieselbe PLZ kann durchaus zu MEHREREN Ortsnamen gehören, und es ist für die Postzustellung notwendig, dass man den Ort separat angibt.
                      Kann? Diese scheiss Teile gehören sogar Orten in unterschiedlichen Bundesländern.

                      Kannst Du dafür bitte ein oder zwei Beispiel-PLZ nennen?

                      Kommt
                      prompt:

                      Braake und Stapelfeld sind Orte in Schleswig Holstein. Biede teien sich die PLZ 22145 mit einem Teil von Hamburg Rahlstedt.

                      Zur PLZ- und Addresssuche der Post

                      Ich behaupte das nicht einfach nur so. Ich schlag mich mit sowas dauernd rum.

                      Es ist in D nicht moeglich eine PLZ einem Ort oder einem Bundesland zuzuteilen. Ausser man faengt an und schummelt sich eien zurecht. Das muss ich dauernd weil unser System ein Bundesland, eine PLZ und nur einen Ortseintrag zulaesst. Bei uns sind die beiden oben genannten Orte unter Hamburg abgespeichert, weil etwaige Kunden aus den kleineren Orten neben Hamburg sich wohl eher mit Hamburg identifizieren als ein Rahlstedter Kunde mit Braake...

                      --
                      Signaturen sind blöd!
                      1. Hi,

                        Das ist FALSCH! Einunddieselbe PLZ kann durchaus zu MEHREREN Ortsnamen gehören, und es ist für die Postzustellung notwendig, dass man den Ort separat angibt.
                        Kann? Diese scheiss Teile gehören sogar Orten in unterschiedlichen Bundesländern.
                        Kannst Du dafür bitte ein oder zwei Beispiel-PLZ nennen?
                        Kommt prompt:

                        Sorry, daß ich erst jetzt reagiere - ich war seit Freitag auf Betriebsausflug und bin grade erst wieder zurück ...

                        Braake und Stapelfeld sind Orte in Schleswig Holstein. Biede teien sich die PLZ 22145 mit einem Teil von Hamburg Rahlstedt.

                        Danke!

                        Zur PLZ- und Addresssuche der Post
                        Ich behaupte das nicht einfach nur so.

                        Das hätte ich auch nicht unterstellen wollen. Ich schlag mich auch täglich mit Adressen rum - mir war nur bisher noch kein Beispiel untergekommen, bei dem sogar unterschiedliche Bundesländer im Spiel sind.
                        Wobei für mich die Bundesländer keine große Rolle spielen, bei mir geht's eher um KFZ-Zulassungsbezirke (auch da gibt's PLZ, die in mehrere Zulassungsbezirke fallen - hab aber kein Beispiel greifbar ...)

                        cu,
                        Andreas

                        --
                        Warum nennt sich Andreas hier MudGuard?
                        O o ostern ...
                        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
                2. Hi,

                  Du denkst, die Postleitzahl wäre einmalig und eindeutig, so dass du anhand der PLZ immer genau einen Ortsnamen bekommst.
                  Das ist FALSCH! Einunddieselbe PLZ kann durchaus zu MEHREREN Ortsnamen gehören, und es ist für die Postzustellung notwendig, dass man den Ort separat angibt.
                  Beispielsweise gehört die PLZ 26835 zu sechs Orten: http://www.plz-postleitzahl.de/land.niedersachsen/plz-26835.html

                  Ergänzung:

                  Bei 6 Ortsnamen für eine PLZ ist noch lang noch nicht Schluß ... ;-)

                  16845 bringt es z.B. auf 29 Ortsnamen (Ob das schon das Maximum ist, weiß ich nicht).

                  Den umgekehrten Fall gibt es aber auch - eine Stadt, viele PLZ (Berlin, Hamburg, München ...) - und teilweise hat sogar eine Straße mehrere PLZ (Landsberger Str. in München - je nach Hausnummer 80339, 80687, 81241, also sogar unterschiedlich in der 2. Stelle!)

                  Und Ortsnamen sind auch nicht wirklich eindeutig (z.B. Lindau - am Bodensee, bei Kiel, in Anhalt)

                  cu,
                  Andreas

                  --
                  Warum nennt sich Andreas hier MudGuard?
                  O o ostern ...
                  Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
  2. Tach!

    Die Orte habe ich in einer separaten Tabelle eingetragen und mit einem LEFT JOIN verbunden.

    Wenn du aus der Orte-Tabelle nur einen einzigen Wert brauchst - den Ortsnamen - dann frag diesen mit einem Subselect ab (geht auch zweimal). Das ist einfacher zu handhaben als die Joinerei.

    Dies funktioniert aber leider nur für die eine Adresse, nicht für die zweite.
    Wenn ich einen zeiten LEFT JOIN einfüge bekomme ich den Fehler, dass der Wert "Orte" unique ist.

    SELECT *

      	FROM adressen  
      	LEFT JOIN orte ON adressen.plzgew = orte.plz  
      	WHERE adressen.plzgew = orte.plz  
      	LEFT JOIN orte ON adressen.plzpriv = orte.plz  
      	ORDER BY nachname
    
      
    Bei diesem Code (dein HTML- und PHP-Zeugs interessiert bei dem Problem nicht) erwarte ich eher einen Syntaxfehler, weil nach dem WHERE kein JOIN auftreten darf. JOIN gehört zu FROM. Wenn deine Absicht wäre, eine weitere für den Join (und nicht nur für die allgemeine Einschränkung der Datensätze) relevante Bedingung anzugeben, dann musst du diese mit AND (oder OR) an die Join-Bedingung anhängen.  
      
    Wenn du mehr als einen Wert aus der Ortstabelle benötigst, dann braucht es doch Joins, dann musst du die beiden Tabellen zur Unterscheidung mit je einem Alias versehen.  
      
      
    dedlfix.
    
  3. nagut, me give up... ich mach es doch manuell... ds is mir zu viel aufwand... evtl. finde ich ja mal eine andere Datenbank, in der ich das wieder aufnehmen kann...

    Danke an alle Antworten.