php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 07-11-2009, 10:23
Kiecker
 Registrierter Benutzer
Links : Onlinestatus : Kiecker ist offline
Registriert seit: Apr 2004
Beiträge: 22
Kiecker ist zur Zeit noch ein unbeschriebenes Blatt
Question Komplexe DB abfrage oder?

Hallo Leute
ich brauche mal eure Hilfe.

Ein Kunde von mir veranstaltet Events. Diese sind in einer Datenbank (MySQL) gepeichert und werden über PHP ausgegeben.
Die DB enthält ein Feld 'tag' in diesem ist der Timestamp des Veranstaltungstages gespeichert.

Nun möchte ich folgende Augabe erzeugen:
die Ausgabe soll immer die aktuellsten Parties anzeigen und zwar bis zu 14 stück. Wenn aber nur 8 da, dann sollen auch nur 8 angezeigt werden.
Das heisst es sollen minimum 8 anzeigt werden, maximal 14 .
Wenn es also nur 6 neue Veranstaltungen gibt (neue = heutiger Tag oder in der Zukunft) sollen noch die beiden letzten alten Veranstaltungen anzeigt werden um auf die 8 zu kommen usw..
Oh man mir fällt es schon schwer das so in Worte zu fassen?

Mein Ansatz:
PHP-Code:
$result mysql_query ("SELECT * FROM `veranst1` WHERE tag >= $timestamp ORDER by tag LIMIT 14",$db);
if (
mysql_errno()) die ("MySQL-Error: " mysql_error());
$ergebnis mysql_query($abfrage); 
while (list (
$id ,$... $preis) = mysql_fetch_row ($result))

So werden mir die nächsten 14 Veranstaltungen angezeigt.
Aber wie bekomme ich es hin mit den min. 8 und den dann auch möglichen alten Einträgen?

Dank an alle die sich mit dem Problem befassen!
Mit Zitat antworten
  #2 (permalink)  
Alt 07-11-2009, 13:14
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Hallo,

ich würde mit
Code:
SELECT * FROM `veranst1` ORDER by tag desc LIMIT 14
erstmal die 14 aktuellsten aus der DB holen. Wenn du die dann durchiterierst, kannst du mit PHP leicht feststellen, ob nach den ersten 8 Datensätzen noch welche kommen, die aktuell sind. Wenn das so ist, gibst du sie ebenfalls aus, wenn nicht break;

Gruß,

Amica
Mit Zitat antworten
  #3 (permalink)  
Alt 08-11-2009, 01:42
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Amica, ich denke dein Vorschlag wird nicht gehen - weil, so wie ich die Aufgabenstellung verstehe, auch jetzt schon vierzehn Silvesterparties eingetragen sein können, und wenn du dann nur die 14 Veranstaltungen mit dem höchsten Timestamp selektierst, dann lieferst du mir bei meiner heutigen Anfrage eben diese Silvesterparties, obwohl ich natürlich erst mal an den Events interessiert wäre, die nächste Woche stattfinden.

Es ist aber ein Interval um einen beliebigen Zeitpunkt herum gefragt.
Und wenn man die Grenzen dieses Intervals nicht vorher über ihren Wert definieren kann, sondern nur über die Anzahl - dann braucht man zwei einzelne Abfragen.

Eine, die von jetzt an die nächsten 14 Veranstaltungen (timestamp >= NOW(), ORDER BY timestamp ASC) heraussucht, und eine, die die 8 letzten, vergangenen Veranstaltungen (timestamp < NOW(), ORDER BY timestamp DESC) liefert.

Die kann man dann in eine UNION stecken, und deren (sortiertes) Ergebnis ggf. auch noch mal einem LIMIT unterziehen.


(Und wenn man, entgegen allen Gesetzen der Vernunft, noch keinen Index auf seiner timestamp-Spalte liegen hat, dann besorgt man sich schnellstens einen ;-)
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #4 (permalink)  
Alt 09-11-2009, 14:05
code-kobold
 Registrierter Benutzer
Links : Onlinestatus : code-kobold ist offline
Registriert seit: Nov 2009
Beiträge: 22
code-kobold befindet sich auf einem aufstrebenden Ast
Standard PHP-Lösung

Eine simple Lösung mit PHP:

PHP-Code:
$result = array();

$l_DBQuery 'SELECT * FROM veranst1 WHERE tag >= {TODAY} ORDER BY tag ASC LIMIT 14';
$l_DBResult mysql_query$l_DBQuery );

$_numRows mysql_num_rows$l_DBResult );

while (
$l_Row mysql_fetch_row$l_DBResult ) ) {
 
array_push$result$l_Row );
}

if( 
$_numRows 14 ) {
    
    
$_limit 14 $_numRows
    
$l_DBQuery 'SELECT * FROM veranst1 WHERE tag < {TODAY} ORDER BY tag DESC LIMIT ' $_limit;

    
$l_DBResult mysql_query$l_DBQuery );

    while (
$l_Row mysql_fetch_row$l_DBResult ) ) {
        
array_push$result$l_Row );
    }
}

arsort$result ); 
{TODAY} steht für die geeignete Funktion zur Ermittlung des Zeitpunktes, um den herum gruppiert werden soll.

@wahsaga: IMHO erzeugt der UNION-Konstrukt die Komplementärmenge der max. nächsten 14 und der max. letzten 8 Ergebnisse, im schlechtesten Fall also 22, ohne die Möglichkeit, die Ergebnisse in der geforderten Anzahl um den Referenzzeitpunkt zu gruppieren.

GZ,

Ron
Mit Zitat antworten
  #5 (permalink)  
Alt 09-11-2009, 14:27
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

@code-kobold: Union erzeugt die Vereinigungsmenge, die Komplementärmenge kann man nur mit einer NOT-IN-verknüpften Unterabfrage bilden.

Mit
Code:
select * from veranst1 where tag >= curdate() order by tag limit 14
union
(select * from veranst1 where tag < curdate() order by tag desc limit 8)
order by tag desc limit 14
kommt man im schlimmsten Fall trotzdem auf 14, nicht 22. Dadurch spart man sich eine Abfrage und kann mit PHP anhand des Datums entscheiden, ob nach dem 8. Datensatz noch weitere Datensätze benutzt werden.
Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
datenbankabfrage, mysql, php


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[gelöst] komplexe SQL-Abfrage funktioniert in phpMyAdmin, jedoch nicht in PHP danyomc SQL / Datenbanken 4 03-11-2009 12:09
komplexe SQL Abfrage Cyberphantom SQL / Datenbanken 16 28-09-2006 11:19
beispiel für komplexe abfrage-seiten zange PHP Developer Forum 2 26-05-2006 15:33
Komplexe DB Abfrage, wer weis einfach Lösung? PHPler BRAINSTORMING PHP/SQL/HTML/JS/CSS 2 14-12-2004 01:07
komplexe Abfrage - Wie??? Matrixx SQL / Datenbanken 3 13-02-2004 18:37

Themen-Optionen
Thema bewerten
Thema bewerten:

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 are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 07:36 Uhr.