Hackerboard WikiHaboWeb Linkverzeichnis

[HaBo]

major security
 
(Web-) Design und webbasierte Sprachen Tipps & Tricks, Designabgleich, HTML & Javascript, Flash, ASP, PHP, Perl/CGI...

Durch Verknüpfung werden gleiche Zellinhalte überschrieben

Diskussion: Durch Verknüpfung werden gleiche Zellinhalte überschrieben im Forum (Web-) Design und webbasierte Sprachen, in der Kategorie Web, Network & Multimedia Palace; Hallo Community, ich hoffe ihr könnt mir helfen, trotz dem merkwürdigen Titel. Ich weiß nicht genau, wie ich das Problem ...

Antwort
Alt 19.12.09, 20:34   #1 (permalink)
 
Registriert seit: 31.03.09
Karma: 3
bivg Leistung: Facit NTK
erledigt Durch Verknüpfung werden gleiche Zellinhalte überschrieben


Hallo Community,

ich hoffe ihr könnt mir helfen, trotz dem merkwürdigen Titel. Ich weiß nicht genau, wie ich das Problem in Worte fassen soll.

Ich mache eine SQL-Abfrage (eingebettet in PHP), mit der in einer Tabelle eine geplante VeranstaltungsID und eine neue VeranstaltungsID abgefragt wird.
In der Veranstaltungstabelle suche ich mir dann zu der ID den Namen heraus.
Diesen Plan will ich dann als Tabelle (planmäßige Veranstaltung und neue Veranstaltung in einer Zeile mit verschiedenen anderen Daten) ausgeben.

PHP-Code:
while( $plan mysql_fetch_array$alleEintraege ) ) {
     echo 
"<tr>
           <td>Planm.:" 
$plan['veranstaltungname'] . "</td>
           <td>Neu:" 
$plan['veranstaltungname'] . "</td>
           </tr>"
;

Mit obigen Code kann ich aber nur den zuletzt geholten Veranstaltungsnamen ausgeben.

Wie kann ich also bei Verknüpfungen den Inhalt einer Spalte abhängig von der ID eines Eintrags in der anderen Tabelle ausgeben lassen?

Danke!

Geändert von bivg (20.12.09 um 19:07 Uhr) Grund: gelöst
bivg ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 19.12.09, 20:57   #2 (permalink)
LX
Moderator
 
Registriert seit: 14.02.06
Karma: 53
LX Leistung: Pentium IIILX Leistung: Pentium IIILX Leistung: Pentium IIILX Leistung: Pentium IIILX Leistung: Pentium III
LX eine Nachricht über ICQ schicken LX eine Nachricht über AIM schicken LX eine Nachricht über Yahoo! schicken
Standard

Poste doch mal die Abfragen, die du auf die Datenbank ausführst und ggf. auch das Tabellenschema. Ansonsten kann ich dein Problem nicht ganz nachvollziehen...
LX ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 20.12.09, 07:47   #3 (permalink)
Themenstarter
 
Registriert seit: 31.03.09
Karma: 3
bivg Leistung: Facit NTK
Standard

Ok, hier ist ein Auszug aus der Tabelle "Plan":
Code:
CREATE TABLE `Plan` (
  `planid` int(5) NOT NULL auto_increment,
  `veranstaltungdatum` varchar(100) default NULL,
  `planveranstaltungid` int(5) default NULL,
  `neuveranstaltungid` int(5) default NULL,
  PRIMARY KEY  (`vertretungid`)
)
Die Tabelle "Veranstaltungen":
Code:
CREATE TABLE `Veranstaltungen` (
  `id` int(5) NOT NULL auto_increment,
  `veranstaltungname` varchar(150) default NULL,
  PRIMARY KEY  (`vertretungid`)
)
Und die Abfrage (Auszug):
PHP-Code:
$alleEintraege mysql_query"SELECT * FROM Plan, Veranstaltungen WHERE Plan.planveranstaltungid=Veranstaltungen.id OR Plan.neuveranstaltungid=Veranstaltungen.id" ); 
In der Tabelle sollen dann Zeile für Zeile die Veranstaltungen gelistet werden.
Wenn nun eine geplante Veranstaltung durch eine neue ersetzt wird, soll in der Tabelle die alte und die neue Veranstaltung stehen. Mit der Ausgabe aus Post #1 wird jedoch der Ausgabewert immer mit der letzten Information (hier dann die neue Veranstaltung) überschrieben, sodass zweimal der Name der neuen Veranstaltung ausgegeben wird.

Auszug aus der Tabelle, die ausgegeben werden soll:
Code:
Datum          Geplant          Stattdessen
00.00.0000     Tanzen
00.00.0000     Turnen           Schwimmen
In meinem Fall würde jedoch in der zweiten Zeile zweimal Schwimmen stehen.

Geändert von bivg (20.12.09 um 08:00 Uhr)
bivg ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 20.12.09, 14:51   #4 (permalink)
LX
Moderator
 
Registriert seit: 14.02.06
Karma: 53
LX Leistung: Pentium IIILX Leistung: Pentium IIILX Leistung: Pentium IIILX Leistung: Pentium IIILX Leistung: Pentium III
LX eine Nachricht über ICQ schicken LX eine Nachricht über AIM schicken LX eine Nachricht über Yahoo! schicken
Exclamation

Bin mir nicht sicher, ob ich jetzt dein Problem verstanden habe... aber wie wär's denn mit einem JOIN statt deiner WHERE-Konstruktion in der Abfrage:

Code:
SELECT * FROM Plan p
LEFT JOIN Veranstaltungen a
    ON p.planveranstaltungid=a.id
LEFT JOIN Veranstaltungen b
    ON p.neuveranstaltungid=b.id
So bekommst du für jeden Datensatz in der Plan-Tabelle die beiden zugehörigen Datensätze der Veranstaltungen.
LX ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 20.12.09, 15:10   #5 (permalink)
Themenstarter
 
Registriert seit: 31.03.09
Karma: 3
bivg Leistung: Facit NTK
Standard

Vielen Dank für die Idee. Aber bekomme ich so mit der Ausgabe aus Post #1, indem ich also aus der Tabelle "Veranstaltungen" den Namen hole nicht auch zweimal den gleichen Namen?

Ich habe mir jetzt damit geholfen zwei Abfragen zu machen. Eine, in der ich geplante Dinge abfrage und eine, in der ich die neuen Dinge abfrage.
Mit dieser Verschachtelung scheint es zumindest zu gehen.
PHP-Code:
while( $plan mysql_fetch_array($planveranstaltungen) ) {
                    
$neu mysql_fetch_array$neuveranstaltungen );
                    echo 
"<td>" $plan['veranstaltungname'] . "</td>
                          <td>" 
$neu['veranstaltungname'] . "</td>"
Oder verstehe ich jetzt die Genialität deiner Lösung nicht richtig?
bivg ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 20.12.09, 16:39   #6 (permalink)
Themenstarter
 
Registriert seit: 31.03.09
Karma: 3
bivg Leistung: Facit NTK
Standard

Hab's jetzt nochmal ausporbiert. Mit deiner Idee ist die Ausgabe jetzt
Code:
Datum          Geplant          Stattdessen
00.00.0000     Turnen           Turnen
00.00.0000     Schwimmen        Schwimmen
Der Eintrag müsste aber in einer Zeile sein. Die erste Spalte mit Turnen und die zweite mit Schwimmen.

Wäre klasse, wenn dir (oder jemand anders) noch was einfallen würde. Mit meiner Methode (zwei Abfragen) klappt es nämlich auch nicht so wirklich.
bivg ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 20.12.09, 16:59   #7 (permalink)
Member of Honour
 
Benutzerbild von beavisbee
 
Registriert seit: 22.02.07
Karma: 161
beavisbee Leistung: SkyNetbeavisbee Leistung: SkyNetbeavisbee Leistung: SkyNetbeavisbee Leistung: SkyNetbeavisbee Leistung: SkyNetbeavisbee Leistung: SkyNetbeavisbee Leistung: SkyNetbeavisbee Leistung: SkyNetbeavisbee Leistung: SkyNetbeavisbee Leistung: SkyNetbeavisbee Leistung: SkyNet
beavisbee eine Nachricht über ICQ schicken
Standard

das Problem ist das "SELECT *" ...

"SELECT *" ist meist ein Anzeichen von Faulheit oder undurchdachtem SQL-Query...
man sollte immer genau definieren, was man überhaupt zurück braucht... gerade wenn man 2 mal über die gleiche Tabelle JOINt, sonst bekommt man in der Ausgabe eben nur 1 Ausgabefeld "veranstaltungname" zurück...


hier ein Code, der funktionieren sollte:
PHP-Code:
<?php

if ($sql=mysql_connect("localhost","root",""))
{
    if(
mysql_select_db("tests_habo"))
    {
        
$query "
        SELECT
        p.veranstaltungdatum as datum,
        v_alt.veranstaltungname as name_alt,
        v_neu.veranstaltungname as name_neu

        FROM Plan p
        LEFT JOIN Veranstaltungen v_alt
            ON p.planveranstaltungid=v_alt.id
        LEFT JOIN Veranstaltungen v_neu
            ON p.neuveranstaltungid=v_neu.id
        
        ORDER BY datum ASC
        "
;
        
        if(!
$result=mysql_query($query))
            die(
"MySQL-Fehler: [".mysql_errno()."] ".mysql_error());
        if(
mysql_num_rows($result)>0)
        {
            echo 
"
                  <table>
                      <tr>
                          <th>
                              Datum
                          </th>
                          <th>
                              geplant
                          </th>
                          <th>
                              stattdessen
                          </th>
                      </tr>
                  "
;
            while(
$line=mysql_fetch_object($result))
            {
                echo 
"
                          <tr>
                              <td>
                                    "
.$line->datum."
                              </td>
                              <td>
                                    "
.$line->name_alt."
                              </td>
                              <td>
                                    "
.$line->name_neu."
                              </td>
                          </tr>
                "
;                
            }
            echo 
"
                  </table>
            "
;
        }
    }
}




?>
hab deine Datenbank-Struktur auch noch minimal verändert:
Für das Feld "veranstaltungdatum" lohnt sich der Typ "datetime" - dann kann man auch gleich, wie in dem Beispielcode, zuverlässig nach diesem sortieren...



Ausgabe:
Code:
 Datum  		 geplant  	 stattdessen
2009-12-21 17:00:00 	turnen 	
2009-12-21 21:00:00 	tanzen 		tischtennis
2009-12-23 18:00:00 	schwimmen 	fußball
2009-12-27 12:00:00 	tanzen
edit:
Die Darstellung des Datums lässt sich mit DATE_FORMAT im SQL-Query beeinflussen
beavisbee ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 20.12.09, 19:07   #8 (permalink)
Themenstarter
 
Registriert seit: 31.03.09
Karma: 3
bivg Leistung: Facit NTK
Standard

Vielen Dank! Ihr habt mir wirklich den Allerwertesten gerettet. Im Moment scheint wirklich mal alles so zu klappen, wie ich mir das vorstelle.

Deswegen markiere ich den Thread mal als gelöst und komme ggf. (hoffentlich nicht ) nochmal auf euch zu.

Wegen dem Datum. Du hast Recht, dass UNIX-Time hier wesentlich sauberer wäre. Leider wurde mir die Datenbank aber so vorgegeben und ich kann nur einige, wenige Änderungen vorschlagen. Mal sehen, was sich tun lässt...
bivg ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 20.12.09, 19:51   #9 (permalink)
Member of Honour
 
Benutzerbild von beavisbee
 
Registriert seit: 22.02.07
Karma: 161
beavisbee Leistung: SkyNetbeavisbee Leistung: SkyNetbeavisbee Leistung: SkyNetbeavisbee Leistung: SkyNetbeavisbee Leistung: SkyNetbeavisbee Leistung: SkyNetbeavisbee Leistung: SkyNetbeavisbee Leistung: SkyNetbeavisbee Leistung: SkyNetbeavisbee Leistung: SkyNetbeavisbee Leistung: SkyNet
beavisbee eine Nachricht über ICQ schicken
Standard

joa, dann speichere, wenn du's als Varchar lässt, den Unix-Timestamp (den bekommst du mit mktime(); ) und bei der Ausgabe holst du dir dein gewünschtes Datums-Format mit date();
beavisbee ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Antwort

[HaBo] » Web, Network & Multimedia Palace » (Web-) Design und webbasierte Sprachen » SQL Durch Verknüpfung werden gleiche Zellinhalte überschrieben
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind an
Refbacks sind an



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194