Daten aus 2 Tabellen auslesen

Guten Abend,
Ich bins wieder einmal mehr,
Ich versuche momentan eine Liste mit den letzten Beiträgen auf der Seite zu machen,
dazu habe ich testweise 2 Tabellen genommen, News und gaestebuch.
(Um noch anzufügen mit einer Tabelle, geht es irgendwie ohne Probleme)
Nun möchte ich aber aus der ersten Tabelle und der 2. Tabelle die letzten Beiträge auslesen, danach sollen sie nach Datum sortiert werden.
Dies bereitet mir allerdings Sorgen ;)

Dabei habe ich dass hier versucht ;) :

Code:
    $sql = "SELECT
                Datum,
                Titel,
                Inhalt

            FROM News     
            INNER JOIN gaestebuch  
            WHERE DATE_ADD(Datum, INTERVAL 3 DAY) >= NOW()
            ORDER BY
                Datum DESC
            LIMIT 2";

Datum ist in beiden Tabellen vorhanden
Titel ist in der News Tabelle vorhanden und Inhalt in der gaestebuch Tabelle.
Mit der where Abfrage möchte ich den Zeitintervall begrenzen und mit Datum Desc halt nach Datum sortieren.
Das funktioniert bei einer Tabelle auch prima, bei 2 Tabellen überhaupt nicht.
Mir fehlt überhaupt die Idee wie ich das umsetzen könnte, damit dies geht.
Später im Script gebe ich das ganze wie folgt aus: (bei einer Tabelle)

Code:
    $result = mysql_query($sql) OR die(mysql_error());
    if(mysql_num_rows($result)) {
        while($row = mysql_fetch_assoc($result)) {
            $a = $row['Datum'];
            $try = strtotime("$a");
            $ez = time();
            $auso = $ez - $try;
            $nun = $auso / 86400;
            echo "    <div class=\"akl\">\n";
            echo "<a href=\"index.php?section=news\">";
            echo "» ";
            echo "</a>";
            echo $row['Titel'];
            echo "    </div>\n";
            echo "    <div class=\"akr\">\n";
            echo "    ‹ ";
            echo ceil($nun);
            echo " Tagen";
            echo "    </div>\n";
            echo "    <div class=\"clearen\">\n";
            echo "    </div>\n";
         
        }
    } else {
            echo "    <div class=\"Aktuell\">\n";
            echo "» Keine News vorhanden\n";
            echo "    </div>\n";
    }

Um hier noch anzufügen, die Daten sind in beiden Tabellen zB so"2008-03-22 14:30:59" gespeichert. Also kein Timestamp. Ich kam erst später auf die Idee, dass Timestamps wahrscheindlich sinnvoller gewesen wären.
Vielleicht hat jemand von euch schonmal sowas gemacht und hätte eine Umsetzungsidee.
Von der Mysql abfrage bis zum Ausgeben der beiden verschiedenen Datensätze.
Grüsse und danke falls sich jemand die Mühe macht.
 
Ich hab jetzt mal nur die ersten Zeilen deines Post gelesen (für mehr bin ich jetzt zu müde :-) ).

Du machst einen Inner Join - was vollkommen falsch ist.
Die Tabellen haben ja null gemeinsam.

Was du brauchst ist eine UNION-Abfrage, bei der du darauf achten musst, dass beide Teil-Abfragen die selben Spalten (Anzahl und Art) zurückgeben.
 
ah ups, danke
Ich kenn mich in dem Bereich leider nicht so aus, noch eine andere Frage hätte ich,
ich möchte ja Inhalt eigentlich gleich behandeln wie den Titel, wie kann ich sowas realisieren? Darf ich dem den Alias Titel geben?
 
Deine beiden Teilselects müssen nicht die gleichen Spaltennamen haben, sondern nur gleiche Spaltenanzahl und Spaltenart.

Inhalt und Titel solltest du also problemlos kombinieren können

SQL:
select spalte1, spalte2, titel from tabelle1
union
select spalte4, spalte5, inhalt from tabelle2
 
Ich hätte jetzt doch nochmal eine Frage, ist es nach/mit Union möglich später mit einer If Abfrage herauszufinden von welcher Tabelle nun der Datensatz stammt?
Soweit ich mitbekommen habe, ist es ja nun so, dass er die praktisch verschmilzt.
Ich möchte nämlich noch die Kategorie angeben in welcher der Post war, bzw eine Link dafür hinzufügen.
Grüsse
 
Hi,

auch das kannst Du mit in das Statement packen:

SQL:
      SELECT spalte1, spalte2, titel, 'tabelle1' as kategorie FROM tabelle1
      union
      SELECT spalte4, spalte5, inhalt, 'tabelle2' as kategorie FROM tabelle2

LG
 
Zuletzt bearbeitet von einem Moderator:
vielen dank, auch das hat super funktioniert und ich habs nun endlich geschafft ;)

PHP:
<?php
    @mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) OR die(mysql_error());
    mysql_select_db(MYSQL_DATABASE) OR die(mysql_error());

    $sql = "
      SELECT Datum, Titel, 'news' AS kategorie FROM News
           WHERE DATE_ADD(Datum, INTERVAL 3 DAY) >= NOW()
      union

      SELECT Datum, Inhalt, 'gb' AS kategorie FROM gaestebuch 
           WHERE DATE_ADD(Datum, INTERVAL 3 DAY) >= NOW()
            ORDER BY
                Datum DESC
            LIMIT 2";
    $result = mysql_query($sql) OR die(mysql_error());
    if(mysql_num_rows($result)) {
        while($row = mysql_fetch_assoc($result)) {
            if(strlen($row['Titel']) >= 20) {
            $row['Titel'] = wordwrap($row['Titel'],20); 
            $row['Titel'] = substr($row['Titel'],0,strpos($row['Titel'],"\n")).'?'; 
            }
            $a = $row['Datum'];
            $try = strtotime("$a");
            $ez = time();
            $auso = $ez - $try;
            $nun = $auso / 86400;
            echo "    <div class=\"akl\">\n";
            if($row['kategorie'] == "news")
            {
            echo "<a href=\"index.php?section=news\">";
            echo "» ";
            echo "news.";
            }
            elseif($row['kategorie'] == "gb")
            {
            echo "<a href=\"index.php?section=gb\">";
            echo "» ";
            echo "book.";
            }
            else
            {
            echo "unbk.";
            }
            echo "</a>";
            echo $row['Titel'];

            echo "    </div>\n";
            echo "    <div class=\"akr\">\n";
            echo "    ‹ ";
            echo ceil($nun);
            echo " Tagen";
            echo "    </div>\n";
            echo "    <div class=\"clearen\">\n";
            echo "    </div>\n";
         
        }
    } else {
            echo "    <div class=\"Aktuell\">\n";
            echo "» Keine News vorhanden\n";
            echo "    </div>\n";
    }
?>
 
Zurück