• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

jüngstes Datum aus mehreren Tabellen filtern und zu Liste zusammenstellen

Wenn es Datetime ist dann ist der Vergleich falsch.

Falsch:
Code:
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))

Richtig:
Code:
WHERE UNIX_TIMESTAMP(Veroeffentlicht_am) < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))

Alternative:
Code:
WHERE Veroeffentlicht_am < DATE_FORMAT(NOW(), '%Y-%m-%d')
 
Werbung:
Wenn es Datetime ist dann ist der Vergleich falsch.

Falsch:
Code:
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))

Richtig:
Code:
WHERE UNIX_TIMESTAMP(Veroeffentlicht_am) < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))

Alternative:
Code:
WHERE Veroeffentlicht_am < DATE_FORMAT(NOW(), '%Y-%m-%d')

Da ich nur das Datum brache, habe ich mich für Date entschieden.
Und
Code:
WHERE Veroeffentlicht_am < DATE_FORMAT(NOW(), '%Y.%m.%d')
verwendet.
nur mit dem LIMIT 1 bekomme ich nur einen Datensatz.
Aber da ich nicht weis wieviele Datensätze mit dem selben (jüngsten) Tagesdatum Datenbankweit aufgelistet werden müssen, bin ich da nun etwas ratlos.

Und wie setze ich tabel_name richtig in den Code ein?
Code:
SELECT   /* Storyname, Beschreibung  */
table_name FROM heisse-fantasien.INFORMATION_SCHEMA.TABLES,
Veroeffentlicht_am,
Storyname as ueberschrift,
Beschreibung as inhalt FROM story
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION

scheit irgendwie nicht richig zu sein

auch
Code:
     echo'<br />
         <b>',mysql_tablename,':</b> ' ,$row->ueberschrift;

Hat noch nicht das gesuchte Ergebniss gebracht
bsp:
Datum letze Änderung
Tabellenname: Überschift Inhalt (zb. aus Story)
Tabellenname: Überschift Inhalt (zb. aus Stellung)... usw.
 
Zuletzt bearbeitet:
nur mit dem LIMIT 1 bekomme ich nur einen Datensatz.
Aber da ich nicht weis wieviele Datensätze mit dem selben (jüngsten) Tagesdatum Datenbankweit aufgelistet werden müssen, bin ich da nun etwas ratlos.

Das LIMIT kannst Du bei dem umgebenden Statement setzen, nicht bei den innerhalb der UNIONs. Zusammen mit ORDER könntest Du hier auch eine zufällige Sortierung erreichen damit nicht immer das selbe angezeigt wird (theoretisch).

Und wie setze ich tabel_name richtig in den Code ein?

Speicher den Namen dort in einer künstlichen Spalte pro Tabellenstatement innerhalb der UNIONs.

Code:
SELECT 'story' as tablename, Veroeffentlicht_am ... FROM story WHERE ...
 
Werbung:
Ich werde aus der Meldung
Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\ENTWICKLUNG von heisse-fantasien\Bereich-home\ueber-home.php on line 173
Operand should contain 1 column(s)

und dem Handbuch zu MySQL 5.1 nicht schlau.
PHP:
<?
setlocale (LC_ALL, 'de_DE@euro', 'de_DE', 'de', 'ge');    // Server Version mit (LC_ALL, 'de_DE@euro', 'de_DE', 'de', 'ge')
                                                          // Local Version seit xampp 1.7.7 (LC_TIME, 'German_Germany')
//  ----- Inhaltliches UpDate -----
//  Auswahl der Tabellen mit Bedinung, Sortierung und Begrenzung der Anzahl
$ergebnis = mysql_query ("SELECT(
SELECT   /* Storyname, Beschreibung  */
'story' as tablename,
Veroeffentlicht_am,
Storyname as ueberschrift,
Beschreibung as inhalt FROM story
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION
SELECT   /* Stellungsbezeichnung, Lueckenfueller (ungenutzt) */
'Stellung' as tablename,
Veroeffentlicht_am,
Stellungbezeichnung as ueberschrift,
Lueckenfueller as inhalt FROM stellungen
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION
SELECT   /* Idee, Lueckenfueller (ungenutzt) */
'Erotikideen' as tablename,
Veroeffentlicht_am,
Idee as ueberschrift,
Lueckenfueller as inhalt FROM erotikideen
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION
SELECT   /* Titel, Vorschau mit Bild von Amazon */
'Bücher' as tablename,
Veroeffentlicht_am,
Titel as ueberschrift,
Vorschaubild as inhalt FROM buecher
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION
SELECT   /* Titel, Vorschau mit Bild von Amazon */
'eBooks' as tablename,
Veroeffentlicht_am,
Titel as ueberschrift,
Vorschaubild as inhalt FROM ebooks
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION
SELECT   /* Titel, Vorschau mit Bild von Amazon */
'Hörspiele' as tablename,
Veroeffentlicht_am,
CD_Titel as ueberschrift,
Vorschaubild as inhalt FROM hoerspiele
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION
SELECT   /* Titel, Vorschau mit Bild von Amazon */
'Filme' as tablename,
Veroeffentlicht_am,
Titel as ueberschrift,
Vorschaubild as inhalt FROM filme
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION
SELECT   /* Zweittitel, Zusammenfassung */
'Projekt' as tablename,
Veroeffentlicht_am,
Zweittitel as ueberschrift,
Zusammenfassung as inhalt FROM projekt
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION
SELECT   /* noch zu klären - provisorisch inhaltliches_UpDate */
'inhaltliches UpDate' as tablename,
Veroeffentlicht_am,
inhaltliches_UpDate as ueberschrift,
Lueckenfueller as inhalt FROM update_inhalt
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))

ORDER BY Veroeffentlicht_am DESC
)
LIMIT 10");

Zeile 173 wäre
PHP:
while($row = mysql_fetch_object($ergebnis) or die(mysql_error()))      // Daten werden gelesen

aber ich habe den Code darüber mit gegeben weil ich vermute das dort bereits die Ursache liegt.

verstehe ich das Handbuch richtig dann sagt
SELECT (SELECT column1, column2 FROM t2) FROM t1;
aus das hinter LIMIT 1 ein FROM ... kommen muss.
Ein Tabelle macht keinen sinn, vermute ich, also muss es wohl die Datenbank sein.
Wenn das so ist habe ich beim ausprobieren noch was falsch geschrieben.
 
Zuletzt bearbeitet:
Die Fehlermeldung von oben macht mich echt wahnsinnig.

wenn ich die umschließende Klammer mit SELECT wegnehme läuft die Abfrage durch.
Setze ich sie dann um das LIMIT entsprechend dem Vorschlag setzen zu können habe ich ab dem zweiten UNION SELECT

myphpadmin meldet
#1241 - Operand should contain 1 column(s)
die Website
Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in C:\xampp\htdocs\ENTWICKLUNG von heisse-fantasien\Bereich-home\ueber-home.php on line 102

Zeile 102
Code:
'story' as tablename,

PHP:
SELECT(
SELECT   /* Storyname, Beschreibung  */
'story' as tablename,
Veroeffentlicht_am,
Storyname as ueberschrift,
Beschreibung as inhalt FROM story
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION
SELECT   /* Stellungsbezeichnung, Lueckenfueller (ungenutzt) */
'Stellung' as tablename,
Veroeffentlicht_am,
Stellungbezeichnung as ueberschrift,
Lueckenfueller as inhalt FROM stellungen
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION
SELECT   /* Idee, Lueckenfueller (ungenutzt) */
'Erotikideen' as tablename,
Veroeffentlicht_am,
Idee as ueberschrift,
Lueckenfueller as inhalt FROM erotikideen
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION
SELECT   /* Titel, Vorschau mit Bild von Amazon */
'Bücher' as tablename,
Veroeffentlicht_am,
Titel as ueberschrift,
Vorschaubild as inhalt FROM buecher
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION
SELECT   /* Titel, Vorschau mit Bild von Amazon */
'eBooks' as tablename,
Veroeffentlicht_am,
Titel as ueberschrift,
Vorschaubild as inhalt FROM ebooks
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION
SELECT   /* Titel, Vorschau mit Bild von Amazon */
'Hörspiele' as tablename,
Veroeffentlicht_am,
CD_Titel as ueberschrift,
Vorschaubild as inhalt FROM hoerspiele
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION
SELECT   /* Titel, Vorschau mit Bild von Amazon */
'Filme' as tablename,
Veroeffentlicht_am,
Titel as ueberschrift,
Vorschaubild as inhalt FROM filme
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION
SELECT   /* Zweittitel, Zusammenfassung */
'Projekt' as tablename,
Veroeffentlicht_am,
Zweittitel as ueberschrift,
Zusammenfassung as inhalt FROM projekt
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION
SELECT   /* noch zu klären - provisorisch inhaltliches_UpDate */
'inhaltliches UpDate' as tablename,
Veroeffentlicht_am,
inhaltliches_UpDate as ueberschrift,
Lueckenfueller as inhalt FROM update_inhalt
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))

ORDER BY Veroeffentlicht_am DESC
)
LIMIT 1
 
Alle Nachfoschungen zur Fehlermeldungen sagen mir was ich eigentlich schon weis... es irgendein öffnende klammer, komma, und so weiter wird nicht geschlossen.
Der Fehler muss in der unterabfrage liegen.
Und zwar im Moment in der ersten UNION

Code:
SELECT   /* Storyname, Beschreibung  */
'Fantasie' as tablename,
Veroeffentlicht_am,
Storyname as ueberschrift,
Beschreibung as inhalt FROM story
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION

Zur Info vor dem select (wie im ganzen Code zu sehen) ist eine umgebende Klammer mit einem Select.
Am ende der Unterabfrage steht eine schließend Klammer und ein LIMIT 1 damit nur der jüngste Tag mit allen Einträgen zu diesem aufgelistet werden. Nicht aber die nächst älteren.

Also:
Nach dem Select wird
der Kommentar geöffnet und geschlossen /*... */ -> OK
die künstliche Spalte(name) geöffnet und geschlossen '... ' -> OK
nach tablename und allen anderen Spalten kommt ein Komma -> OK (ausnahme letzte Spalte) -> OK
die Zeitel mit dem UNIX_TIMESTAMP ... jede Klammer und das Format wird geöffnet und geschlossen -> OK

wo ist dann der Fehler???
 
Werbung:
Schwierigkeiten mit der Unterabfrage bzw. umgebenden Klammer

Die Fehlermeldungen werden erst ausgegeben wenn ich die umgebenden Klammern einsetzt.
Sprich eine Unterabfrage erstelle.

Wenn ich das Handbuch MySQL :: MySQL 5.1 Referenzhandbuch :: 13.2.8 Syntax von Unterabfragen richtig verstanden habe muss ich zu dem
Code:
[COLOR=#000000][COLOR=#0000CC]SELECT[/COLOR][COLOR=#006600]([/COLOR][COLOR=#0000CC]SELECT   [/COLOR][COLOR=#FF9900]/* Storyname, Beschreibung  */[/COLOR][/COLOR]....

noch ein FROM und WHERE einbauen... also
Code:
[COLOR=#000000][COLOR=#0000CC]SELECT[/COLOR][COLOR=#006600] ? FROM ? WHERE ? ([/COLOR][COLOR=#0000CC]SELECT   [/COLOR][COLOR=#FF9900]/* Storyname, Beschreibung  */[/COLOR][/COLOR]....
aber da habe ich ein Problem was muss ich da angeben?

Code:
[COLOR=#000000][COLOR=#0000CC]SELECT[/COLOR][COLOR=#006600] Veroeffentlicht FROM ? WHERE ? ([/COLOR][COLOR=#0000CC]SELECT   [/COLOR][COLOR=#FF9900]/* Storyname, Beschreibung  */[/COLOR][/COLOR]....[
würde ja noch sinn machen aber von welcher Tabelle?
Ich habe doch irgendwo gelesen das man die selbe Tabelle dann nicht in der Unterabfrage haben darf
also fällt ein
Code:
[COLOR=#000000][COLOR=#0000CC]SELECT[/COLOR][COLOR=#006600] Veroeffentlicht FROM story, stellung, ....  WHERE ? ([/COLOR][COLOR=#0000CC]SELECT   [/COLOR][COLOR=#FF9900]/* Storyname, Beschreibung  */[/COLOR][/COLOR]....[
aus den die Tabellen kommen ja nochmal in der Unterabfrage vor.

Die Unterabfrage ohne umgebende Klammer funktioniert. Das steht mal fest.
Aber das LIMIT muss wie ich hier gelernt habe in eine Umgebende Klammer damit nur ein Tagesdatum mit allen dazugehörigen Einträgen ausgeliefert wird.
 

Nein, das dort beschriebene Vorgehen ist eine Möglichkeit. Theoretisch gesprochen geht es nur darum, dass eine Unterabfrage eine eigene Datenmenge in das "Haupt-"Statement einbringt. Daher kann eine Unterabfrage an theoretisch beliebigen Stellen im Hauptstatement stehen.

Für deinen Fall ist jedoch das was ich oben schrieb richtig. Also:

Code:
SELECT .. FROM ( SELECT .. FROM .. WHERE .. ) WHERE .. LIMIT ..

Übersetzt:
Die Unterabfrage soll als Basistabelle für das Hauptstatement dienen. Die dabei herauskommende Datenmenge wird per SELECT des Hauptstatements sowie der WHERE-Bedingung und LIMIT-ierung beschränkt.

Die Meldung
#1241 - Operand should contain 1 column(s)

könnte darauf hindeuten, dass Du innerhalb der Unterabfrage innerhalb der UNIONs bei mindestens einer darin eingebundenen Tabelle eine andere Anzahl Spalten ausliest.

Falsch:
Code:
SELECT spalte1, spalte2 FROM tabelle1
UNION
SELECT spalte1 FROM tabelle2

Richtig:
Code:
SELECT spalte1, spalte2 FROM tabelle1
UNION
SELECT spalte1, spalte2 FROM tabelle2

Wenn dein SQL-Statement im phpmyadmin bereits nicht funktioniert, wird es auch in der Webseite nicht funktionieren. Daher bringt es nichts das Statement an beiden Stellen zu prüfen. Erst muss es im phpmyadmin richtig funktionieren.
 
Also ich habe nun also

Code:
 (SELECT Veroeffentlicht_am FROM (
SELECT   /* Storyname, Beschreibung  */
'Fantasie' as tablename,
Veroeffentlicht_am,
Storyname as ueberschrift,
Beschreibung as inhalt FROM story
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION
......

                         UNION
SELECT   /* noch zu klären - provisorisch inhaltliches_UpDate */
'inhaltliches UpDate' as tablename,
Veroeffentlicht_am,
inhaltliches_UpDate as ueberschrift,
Lueckenfueller as inhalt FROM update_inhalt
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))

ORDER BY Veroeffentlicht_am DESC
)
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))  LIMIT 1);


#1248 - Every derived table must have its own alias

Wenn ich das richtig gelesen habe muss jede Spalte seinen Alias haben. Z.B. ... as tablename oder.... as ueberschrift.
brauche ich für Veroeffentlicht_am auch einen ?
Das ist doch schon eine Spalte die in allen Tabellen gleich heist und gleichen Typs ist.

zum Where nach der umschließenden Klammer... frage ich dann doch gleich mal darf ich das so noch mal aufrufen oder ist das falsch?
 
Werbung:
Aufbaureihenfolge richtig?

mit dem Code
Code:
SELECT Veroeffentlicht_am, tablename, ueberschrift, inhalt FROM (
SELECT   /* Storyname, Beschreibung  */
'Fantasie' as tablename,
Veroeffentlicht_am,
Storyname as ueberschrift,
Beschreibung as inhalt FROM story
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION
....
                         UNION
SELECT   /* noch zu klären - provisorisch inhaltliches_UpDate */
'inhaltliches UpDate' as tablename,
Veroeffentlicht_am,
inhaltliches_UpDate as ueberschrift,
Lueckenfueller as inhalt FROM update_inhalt
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))

ORDER BY Veroeffentlicht_am DESC
) as Kopf
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))  LIMIT 1

mit LIMIT 1 bekomme ich die gewünschenten Spalten (tablename, inhalt, ueberschrift mit dem Datum aus Veroeffentlicht_am) und einem Eintrag.
mit LIMIT 5 bekomme ich die Spalten mit dem Datum aus Veroeffentlicht_am und fünf Einträge.
27.04.12.....
27.04.12.....
27.04.12.....
27.04.12.....
25.04.12.....

Ich habe 4 Mustereinträge mit dem Datum 27.4.12 in vier verschienden Tabellen gemacht.

Fragen:
1) Wie begrenze ich das Datum auf das jüngste ohne zuwissen wie groß die Anzahl der Einträge mit gleichem Tagesdatum ist?

LIMIT kann hier scheinbar nicht die lösung sein.
Ich habe schon an das Gegenteil von DESTINCT gedacht.
Aber das was ich da an Lösungen aus dem Netz gefunden habe hat das Gegenteil nicht auf den jüngsten WERT Veroeffentlicht_am beschränkt.
SELECT OrderDate, COUNT(*) AS cnt FROM order_order GROUP BY OrderDate HAVING cnt >1

kann mir jemand diesen Lösungsansatz erklären. Ich bekomme nicht die

gesuchte Lösung:
Veroeffentlicht_am 27.4.12
tabelname ueberschrift inhalt
tabelname ueberschrift inhalt
tabelname ueberschrift inhalt
tabelname ueberschrift inhalt

Einträge von älteren fallen raus.
ich bin im Moment erst mal nur bei phpmyadmin und noch nicht bei der Website die ständig auch von einem
 
Zuletzt bearbeitet:
Die Verwirrung ist perfekt

1.) gesuchte Lösung News:
(link führt zu dem was ich aktuell händisch mache / extra tabelle) http://www.heisse-fantasien.de/index.php?Bereich=home&Inhalt=ueber-home
News1.jpg
Die Notice in der unterstrichen Zeile habe ich durch ein zusätzliches
Code:
$row = mysql_fetch_object($ergebnis) or die(mysql_error());      // Daten werden gelesen
gelöst.
Ich musste zwar deswegen auch die erste Zeile noch einmal setzen, weil sie dann nicht mehr von der while-schleife abgearbeitet wird. (nicht so schön) aber was solls.
Ob das noch Probleme gibt kann ich im moment nicht einschätzen.

Der aktuelle Code ist nun also folgender.
Und das Problem mit der Begrenzung vom Datum ist noch immer vorhanden. (immer das jüngste. im bsp 27.4.12)
Ich habe mit ORDER und mit GROUP kombieniert mit LIMIT 1 mein Glück probiert.
Leider ohne Erfolg

PHP:
<?php

$ergebnis = mysql_query ("SELECT
 /* Storyname, Beschreibung  */
'Fantasie' as tablename,
Veroeffentlicht_am,
Storyname as ueberschrift,
Beschreibung as inhalt FROM story
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION
SELECT   /* Stellungsbezeichnung, Lueckenfueller (ungenutzt) */
'Stellung' as tablename,
Veroeffentlicht_am,
Stellungbezeichnung as ueberschrift,
Lueckenfueller as inhalt FROM stellungen
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION
SELECT   /* Idee, Lueckenfueller (ungenutzt) */
'Erotikideen' as tablename,
Veroeffentlicht_am,
Idee as ueberschrift,
Lueckenfueller as inhalt FROM erotikideen
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION
SELECT   /* Titel, Vorschau mit Bild von Amazon */
'Bücher' as tablename,
Veroeffentlicht_am,
Titel as ueberschrift,
Vorschaubild as inhalt FROM buecher
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION
SELECT   /* Titel, Vorschau mit Bild von Amazon */
'eBooks' as tablename,
Veroeffentlicht_am,
Titel as ueberschrift,
Vorschaubild as inhalt FROM ebooks
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION
SELECT   /* Titel, Vorschau mit Bild von Amazon */
'Hörspiele' as tablename,
Veroeffentlicht_am,
CD_Titel as ueberschrift,
Vorschaubild as inhalt FROM hoerspiele
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION
SELECT   /* Titel, Vorschau mit Bild von Amazon */
'Filme' as tablename,
Veroeffentlicht_am,
Titel as ueberschrift,
Vorschaubild as inhalt FROM filme
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION
SELECT   /* Zweittitel, Zusammenfassung */
'Projekt' as tablename,
Veroeffentlicht_am,
Zweittitel as ueberschrift,
Zusammenfassung as inhalt FROM projekt
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))
                         UNION
SELECT   /* noch zu klären - provisorisch inhaltliches_UpDate */
'inhaltliches UpDate' as tablename,
Veroeffentlicht_am,
inhaltliches_UpDate as ueberschrift,
Lueckenfueller as inhalt FROM update_inhalt
WHERE Veroeffentlicht_am < UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%d.%m.%Y'))

ORDER BY Veroeffentlicht_am DESC
  LIMIT 5");

$row = mysql_fetch_object($ergebnis) or die(mysql_error());      // Daten werden gelesen

       echo'
        <div class="news">
        <h2>Letzte Änderung: ' ,strftime("%A  %d. %B %Y", strtotime($row->Veroeffentlicht_am)), '</h2>';

                                      // Abfrage ob USER 18 oder minderjährig
     if ($_GET['p4'] == "fsk18")
     { // -->  USER ist Volljährig
       // weitere Bedinugnen
     } // FSK18 Ende

     else
     { // -->  USER ist minderjährig

     // Story
     echo'<br />
         ',$row->Veroeffentlicht_am,' <b>',$row->tablename,':</b> ' ,$row->ueberschrift, $row->inhalt;


     } // Minderjährig END

while($row = mysql_fetch_object($ergebnis) or die(mysql_error()))      // Daten werden gelesen
{

                                      // Abfrage ob USER 18 oder minderjährig
     if ($_GET['p4'] == "fsk18")
     { // -->  USER ist Volljährig
       // weitere Bedinugnen
     } // FSK18 Ende

     else
     { // -->  USER ist minderjährig

     // Story
     echo'<br />
         ',$row->Veroeffentlicht_am,' <b>',$row->tablename,':</b> ' ,$row->ueberschrift, $row->inhalt;


     } // Minderjährig ENDE
};

                 echo'
        </div>';


Ich entwickle zu erst an Lösung 1 um daraus 2 zu erweitern.


2.) gesuchte Lösung UpDate-Liste:
(link führt zu dem was ich aktuell händisch mache / extra tabelle)
http://www.heisse-fantasien.de/index.php?Bereich=projekt&Inhalt=veraenderungen_ab_2012
Veroeffentlicht_am 27.4.12
tabelname ueberschrift inhalt
tabelname ueberschrift inhalt
tabelname ueberschrift inhalt
tabelname ueberschrift inhalt

Veroeffentlicht_am 25.4.12

tabelname ueberschrift inhalt

...verschiedene weiter Daten ...

Veroeffentlicht_am 1.1.12

tabelname ueberschrift inhalt
tabelname ueberschrift inhalt

Einträge vor dem 1.1.12 fallen raus.
 

Anhänge

  • News1.jpg
    32 KB · Aufrufe: 2
Zuletzt bearbeitet:
Ich stecke echt fest... und überlege wie ich meine Lösung noch genauer beschreiben soll.
Aber ich denke mit den Links und Screenshot ist das gut beschrieben.
 
Werbung:
Geschwindikeitssteigerung bei Abfrage

So alle Probleme gelöst.:D
Ich habe wohl etwas Abstand gebraucht.

Ich musste wegen der UNION in einigen Tabellen zusätzliche Spalten einfügen.
Diese sind aber (aktuell) ungenutzt sprich Leer. Lückenfüller
Würde es für die Geschwindigkeit etwas bringen in diesen Fällen die Möglichkeit NULL einzubauen.
Und wenn diese dann ungenutzt sind auf NULL zu setzten?
 
Prima, mir geht es auch manchmal so. Zu viel Konzentration auf etwas zerstört die kreativen Ideen dabei ;)

Diese zusätzlichen Spalten hättest Du nicht einfügen müssen. Wie ich schon sagte kann man diese auch virtuell abbilden. Z.B. mit

Code:
SELECT 'irgendein text' spaltenname ...

Der NULL-Wert wird wenig bringen. Solange es sich um nicht-Integer-Datentypen handelt ist eine Optimierung hierfür auch etwas schwieriger. Ich würde wie gesagt auf diese zusätzlichen Spalten die eh keine Aufgabe haben verzichten - unnötiger Balast.
 
Prima, mir geht es auch manchmal so. Zu viel Konzentration auf etwas zerstört die kreativen Ideen dabei ;)

Diese zusätzlichen Spalten hättest Du nicht einfügen müssen. Wie ich schon sagte kann man diese auch virtuell abbilden. Z.B. mit

Code:
SELECT 'irgendein text' spaltenname ...

Der NULL-Wert wird wenig bringen. Solange es sich um nicht-Integer-Datentypen handelt ist eine Optimierung hierfür auch etwas schwieriger. Ich würde wie gesagt auf diese zusätzlichen Spalten die eh keine Aufgabe haben verzichten - unnötiger Balast.

ja das Hast Du beschrieben und in für tablename habe ich das ja auch verwendet, um der Abfrage eine zusätzliche Ausgabe-Spalte zu geben.
Aber tablename = spaltenname und 'irgendein text' = viertueller Name (der ausgegeben wird)
Doch in diesem Fall fehlte der Tabelle eine weitere Spalte und so hab ich Lückenfüller eingefügt. Das war eigentlich noch OK da ich für diese später tatsächlich einer Aufgabe habe.

Aber nun ist da noch eine weitere (anderer Typ)
Ich hatte erst probiert ob ich
Code:
div_tab_spalten as ueberschrift,
Lückenfüller as Vorschau,
Lückenfüller as url, (noch eine Spalte)
FSK18, (ebenfalls zusätzlich - andere Typ)

Aber das schien nicht zu gehen.
So wie ich bei Veroeffentlicht_am auch darauf gestoßen bin das die Spaltenposition in der Tabelle (zumindest in diesem Fall) eine Rolle spielt.
Also wie meist Du das in diesem Fall wenn der Datenbank-Tabelle spalten fehlen?

Ich hoffe ich konnte verdeutlichen was ich meine sonnst muss ich mal die Übersicht-Tabelle schicken die ich mir erstellen möchte. (langsam wirds unübersichtlich welche Spalten von welcher Tabelle ich extern bzw. intern benötige)
spaltenverwendung.jpg
 
Zuletzt bearbeitet:
Werbung:
Wenn Du das in SQL schreibst

Code:
div_tab_spalten as ueberschrift,
Lückenfüller as Vorschau,
Lückenfüller as url, (noch eine Spalte)
FSK18, (ebenfalls zusätzlich - andere Typ)

musst Du die "Lückenfüller" auch mit Anführungszeichen umgeben, sonst sucht MySQL nach einer Spalte die den Namen "Lückenfüller" hat. Also:

Code:
div_tab_spalten as ueberschrift,
'Lückenfüller' as Vorschau,
'Lückenfüller' as url, (noch eine Spalte)
FSK18, (ebenfalls zusätzlich - andere Typ)
 
Lösungsvorschlag

Moin,

auch wenn dieses Thema evtl. schon erledigt sein sollte (was aber nicht eindeutig erkennbar ist), zeige ich mal eine weitere Möglichkeit für das gewünschte Ergebnis:

Code:
SELECT t.*
    FROM (
            SELECT   /* Storyname, Beschreibung  */
                'Story' AS tablename,
                Veroeffentlicht_am AS Datum,
                Storyname AS ueberschrift,
                Beschreibung AS inhalt 
            FROM story
            WHERE Veroeffentlicht_am < CURDATE()
            
            UNION
            
            SELECT   /* Stellungsbezeichnung, Lueckenfueller (ungenutzt) */
                'Stellung',
                Veroeffentlicht_am,
                Stellungbezeichnung,
                NULL /*Lückenfüller!!!*/
            FROM stellungen
            WHERE Veroeffentlicht_am < CURDATE()            
    ) AS t
    
    WHERE t.Datum = 
        (
            SELECT MAX(tt.Datum)
            FROM
                ( SELECT 
                        Veroeffentlicht_am AS Datum
                        FROM story 
                        WHERE Veroeffentlicht_am < CURDATE()
                        
                    UNION
                    
                    SELECT
                        Veroeffentlicht_am
                        FROM stellungen 
                        WHERE Veroeffentlicht_am < CURDATE()
                ) AS tt
        )
        
    GROUP BY t.tablename, t.inhalt
ORDER BY ...

Exemplarisch habe ich hier nur zwei Tabellen in die UNION-Klausel(n) verwendet; selbstredend müssen dann die anderen Tabellen entsprechend eingebaut werden.

Bei einem UNION reicht es aus, NUR in dem ersten SELECT die Spaltennamen mit einem ALIAS zu notieren, da der Spaltenname dann für alle weiteren UNION-SELECTs gültig ist.

Weiterhin kann für nicht vorhandene Spalten einer verwendeten Tabelle durchaus NULL als 'Lückenfüller' genutzt werden.

Erklärung zu meinem Beispiel:

1. Die (interne) Ergebnistabelle aller UNIONs wird mit einem Alias versehen (hier t) und mit einem SELECT * ausgegeben.

2. In der WHERE-Klausel werden dann nur die Datensätze herausgefiltert, die das jüngste Datum beinhalten. Hier greife ich auf ein weiteres UNION, das mir nur das grösste Datum=jüngste Datum als Ergebnis liefert und als Vergleich dient.


Hinweis: Da nur das Datum zum Vergleich herangezogen wird, reicht CURDATE() völlig aus.



Vorschlag #2:

Code:
/* das jüngste Datum als Systemvariable ermitteln */
SET @datum := 
                (
                    SELECT MAX(tt.Datum)
                    FROM
                        ( SELECT 
                                Veroeffentlicht_am AS Datum
                                FROM story 
                                WHERE Veroeffentlicht_am < CURDATE()
                                
                            UNION
                            
                            SELECT
                                Veroeffentlicht_am
                                FROM stellungen 
                                WHERE Veroeffentlicht_am < CURDATE()
                        ) AS tt        
                ); /* !! WICHTIG! Das abschliessende Semikolon IST ZWINGEND zum Abgrenzen des Statements !! */

/* Datensätze anhand des zuvor ermittelten Datums heraussuchen */
SELECT t.*
    FROM (
            SELECT   /* Storyname, Beschreibung  */
                'Story' AS tablename,
                Veroeffentlicht_am AS Datum,
                Storyname AS ueberschrift,
                Beschreibung AS inhalt 
            FROM story
            WHERE Veroeffentlicht_am = @datum
            
            UNION
            
            SELECT   /* Stellungsbezeichnung, Lueckenfueller (ungenutzt) */
                'Stellung',
                Veroeffentlicht_am,
                Stellungbezeichnung,
                NULL /*Lückenfüller!!!*/
            FROM stellungen
            WHERE Veroeffentlicht_am = @datum            
    ) AS t
    
    
    GROUP BY t.tablename, t.inhalt

'Trick' beim o.a. Beispiel ist der, dass zuerst das jüngste Datum aus allen Tabellen ermittelt wird und in der Systemvariablen @datum abgelegt wird.
Diese Systemvariable wird dann für den Vergleich in den UNION-Selects herangezogen.
 
Zuletzt bearbeitet:
Zurück
Oben