SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

Websites optimieren für Google & Co.

Websites optimieren für Google & Co. zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > MySQL/MySQLi

MySQL/MySQLi Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQL/MySQLi diskutieren

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 27.10.2010, 16:18:58
madmix madmix ist offline
Anfänger
 
Registriert seit: Oct 2010
Alter: 58
Beiträge: 8
Mit JOIN eine Tabelle zweimal abfragen

Hallo

Ich hab da mal ein kleines Problem und hoffe hier geholfen zu werden.

Ich habe in einer Tabelle zwei Felder für Datumsangaben in Form von 'yyyymmdd'
Die erste signalisiert ein 'von' Datum, die zweite ein 'bis' Datum.

Diese Datensätze per while-Schleife abzufragen ist kein Problem.
Es werden mir der Reihe nach alle Sätze angezeigt.

Beispiel:
20101010, 20101023 => Ergebnis erste Reihe
20101025, 20101101 => Ergebnis zweite Reihe

Nun möchte ich aber in der Abfrage nicht nur den aktuellen Datensatz haben, sondern auch noch das 'von' Datum der nächsten Reihe.

Meine Ausgabe soll dann so aussehen:

20101010, 20101023, 20101025
20101025, 20101103, nächstes von usw.

Dies habe ich nun versucht mit JOIN zu erzielen, was aber nicht so ganz Klappt.
Ich bekomme zwar das zusätzliche Feld korrekt angezeigt, nur die 'von, bis' Felder haben irgendwann immer die selben Werte.

Anzeige (mit den korrekten Werten aus der Tabelle):

20110731, 20110813, NULL
20100927, 20101007, 20101010
20101010, 20101023, 20101228
20101010, 20101023, 20110417
20101010, 20101023, 20110509
20101010, 20101023, 20110612
20101010, 20101023, 20110626
20101010, 20101023, 20110709
20101010, 20101023, 20110723
20101010, 20101023, 20110731

Es sollte aber so ausschauen, damit ich da im weiteren Verlauf meiner Programmierung mit arbeiten kann:

20100927, 20101007, 20101010
20101010, 20101023, 20101228
20101228, 20110102, 20110417
20110417, 20110427, 20110509
20110509, 20110514, 20110612
20110612, 20110626, 20110626
20110626, 20110709, 20110709
20110709, 20110723, 20110723
20110723, 20110731, 20110731
20110731, 20110813, NULL

Ich glaube das ich in der SELECT-Abfrage irgendwas verkehrt machen

Hier mein SQL-Select dazu:

Code:
SELECT a.*,b.from_date 
  AS next_von 
  FROM reservations 
  AS a 
  LEFT JOIN reservations 
  AS b 
  ON a.object_id = b.object_id 
  AND a.to_date <= b.from_date 
  WHERE a.object_id = '311'
  GROUP BY b.from_date
Ich hoffe ich habe mich verständlich ausgedrückt und ihr könnt helfen.
Im vorraus Danke Mad
Mit Zitat antworten
  #2  
Alt 27.10.2010, 16:47:53
DokuLeseHemmung DokuLeseHemmung ist offline
SELFPHP Experte
 
Registriert seit: Jun 2008
Alter: 12
Beiträge: 2.269
AW: Mit JOIN eine Tabelle zweimal abfragen

Zitat:
Ich habe in einer Tabelle zwei Felder für Datumsangaben in Form von 'yyyymmdd'
Das würde ich so nicht tun!
MySQL brngt sehr leistungsfähige Datentypen und Funktionen mit.
Mit Zitat antworten
  #3  
Alt 27.10.2010, 16:52:29
madmix madmix ist offline
Anfänger
 
Registriert seit: Oct 2010
Alter: 58
Beiträge: 8
AW: Mit JOIN eine Tabelle zweimal abfragen

Zitat:
Zitat von DokuLeseHemmung Beitrag anzeigen
Das würde ich so nicht tun!
MySQL brngt sehr leistungsfähige Datentypen und Funktionen mit.
Leider sind diese Datentypen so vorgegeben, ich arbeite auf einer (nicht von mir konzipierten) bestehenden DB und da diese Felder für noch ganz andere Sachen benötigt werden, muss ich mit dem Leben was da ist (ich selbst hätte mit nem Unix Timestamp gearbeitet).
Mit Zitat antworten
  #4  
Alt 27.10.2010, 17:04:23
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 11
Beiträge: 395
AW: Mit JOIN eine Tabelle zweimal abfragen

Kannst Du uns zusätzlich zu Deiner bisherigen SQL-Abfrage noch die

- Tabellenstruktur (CREATE TABLE reservations .. ) sowie ein paar sinnvolle
- Testdaten (INSERT ... Befehle )

liefern. Dann läßt sich eine SQL-Lösung schneller und leichter ausprobieren.

Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #5  
Alt 27.10.2010, 17:34:00
madmix madmix ist offline
Anfänger
 
Registriert seit: Oct 2010
Alter: 58
Beiträge: 8
AW: Mit JOIN eine Tabelle zweimal abfragen

Zitat:
Zitat von thomas_w Beitrag anzeigen
Kannst Du uns zusätzlich zu Deiner bisherigen SQL-Abfrage noch die

- Tabellenstruktur (CREATE TABLE reservations .. ) sowie ein paar sinnvolle
- Testdaten (INSERT ... Befehle )

liefern. Dann läßt sich eine SQL-Lösung schneller und leichter ausprobieren.

Grüße
Thomas
CREATE kann ich nicht liefern, da ich diese Tabelle nicht erstellt habe.
Die Struktur sieht folgendermaßen aus:

object_id int(11)
from_date varchar(255)
to_date varchar(255)

INSERT ist eigentlich ganz einfach

INSERT INTO reservations (object_id,from_date,to_date) VALUES ('".$_POST["obj_id"]."','".$_POST["from"].'",'".$_POST["to"]."')

ein passendes Update wäre dann:

UPDATE reservations SET from = '".$_POST["from"]."', to = '".$_POST["to"]."' WHERE object_id = '".$_POST["obj_id"]."'


Aber auch das habe ich nicht realisiert.
Zum besseren Verständnis sei gesagt, das wir mit mehreren Leuten an diesem Projekt arbeiten und mir die Aufgabe zugefallen ist einen Belegungskalender anhand der vorhandenen Daten aufzubauen.
Daher muss ich das so nehmen wie es ist und das beste draus machen.

Geändert von madmix (27.10.2010 um 17:51:02 Uhr)
Mit Zitat antworten
  #6  
Alt 27.10.2010, 21:06:51
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 11
Beiträge: 395
AW: Mit JOIN eine Tabelle zweimal abfragen

Was soll's, mach ich mir eben selber ein kleines Beispiel.

Code:
CREATE TABLE test1 (
 id INT NOT NULL,
 datum1 VARCHAR(8) NOT NULL,
 datum2 VARCHAR(8) NOT NULL,
 PRIMARY KEY(id)
);

INSERT INTO test1 VALUES 
( 1, '20100501', '20100502' ),
( 2, '20100503', '20100504' ),
( 3, '20100505', '20100506' );


SELECT t1.datum1, t1.datum2, t2.datum1
  FROM ( SELECT id+1 AS id, datum1, datum2
           FROM test1 ) t1
  LEFT JOIN ( SELECT id , datum1, datum2
           FROM test1 ) t2
    ON t2.id = t1.id
ORDER BY t1.datum1;
     
+----------+----------+----------+
| datum1   | datum2   | datum1   |
+----------+----------+----------+
| 20100501 | 20100502 | 20100503 |
| 20100503 | 20100504 | 20100505 |
| 20100505 | 20100506 | NULL     |
+----------+----------+----------+
3 rows in set (0.01 sec)

mysql>
Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #7  
Alt 27.10.2010, 21:12:20
Ckaos Ckaos ist offline
Member
 
Registriert seit: Nov 2007
Beiträge: 843
AW: Mit JOIN eine Tabelle zweimal abfragen

Hi

würde, wenn ich das richtig verstanden habe. nen subselect wählen
ala
Code:
SELECT a.*,
(SELECT b.`from_date` 
  AS next_von 
  FROM reservations as b where b.`from_date`>a.`from_date`) 
  AS next_von 
  FROM reservations as a
mfg

CKaos

PS:
Zitat:
CREATE kann ich nicht liefern, da ich diese Tabelle nicht erstellt habe.
kleiner tip wenn du Sie per phpmyadmin kopierst kannst du den create
markieren oder sie einfach per sql exportieren.

@thomas ich glaube er meine nicht die nächste id sondern den nächsten starttermin
__________________
"Wenn die Leute Häuser so bauen würden, wie wir Programme schreiben, würde der erstbeste Specht unsere Zivilisation zerhacken."
In den allermeisten Fällen sitzt der Bug etwa 40 cm vor dem Monitor!
Mit Zitat antworten
  #8  
Alt 27.10.2010, 21:27:07
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 11
Beiträge: 395
AW: Mit JOIN eine Tabelle zweimal abfragen

@Ckaos
Stimmt, so geht es auch, wäre ich erst einmal nicht darauf gekommen. Allerdings musst Du darauf achten, das der SUB-Select nur eine Row zurück liefern darf,
sonst gibt es einen SQL-Error.


Code:
SELECT t1.datum1, t1.datum2, ( SELECT MIN(t2.datum1) FROM test1 t2 WHERE t2.datum1 > t1.datum2 ) AS datum1
  FROM test1 t1
ORDER BY t1.datum1;

+----------+----------+----------+
| datum1   | datum2   | datum1   |
+----------+----------+----------+
| 20100501 | 20100502 | 20100503 |
| 20100503 | 20100504 | 20100505 |
| 20100505 | 20100506 | NULL     |
+----------+----------+----------+
3 rows in set (0.04 sec)

mysql>
Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #9  
Alt 27.10.2010, 21:42:32
madmix madmix ist offline
Anfänger
 
Registriert seit: Oct 2010
Alter: 58
Beiträge: 8
AW: Mit JOIN eine Tabelle zweimal abfragen

Zitat:
Zitat von thomas_w Beitrag anzeigen
Was soll's, mach ich mir eben selber ein kleines Beispiel.

Code:
CREATE TABLE test1 (
 id INT NOT NULL,
 datum1 VARCHAR(8) NOT NULL,
 datum2 VARCHAR(8) NOT NULL,
 PRIMARY KEY(id)
);

INSERT INTO test1 VALUES 
( 1, '20100501', '20100502' ),
( 2, '20100503', '20100504' ),
( 3, '20100505', '20100506' );


SELECT t1.datum1, t1.datum2, t2.datum1
  FROM ( SELECT id+1 AS id, datum1, datum2
           FROM test1 ) t1
  LEFT JOIN ( SELECT id , datum1, datum2
           FROM test1 ) t2
    ON t2.id = t1.id
ORDER BY t1.datum1;
     
+----------+----------+----------+
| datum1   | datum2   | datum1   |
+----------+----------+----------+
| 20100501 | 20100502 | 20100503 |
| 20100503 | 20100504 | 20100505 |
| 20100505 | 20100506 | NULL     |
+----------+----------+----------+
3 rows in set (0.01 sec)

mysql>
Grüße
Thomas
Die Abfrage ist super, nur leider hat die Tabelle keine fortlaufende id sondern eine eindeutige ObjectId (hier z.B. die '311').
Ich kann also in der zweiten Abfrage die Id nicht mit +1 abfragen.

Wenn ich jetzt allerdings nachträglich eine AUTO INCREMENT Id einbaue kann es sein das diese id's nicht fortlaufend sind wg der Datumswerte der Einträge.
Aber ich habe mal ein wenig rumexperimentiert und mit

Code:
SELECT a.from_date, a.to_date, b.from_date AS next
  FROM ( SELECT object_id AS object_id, from_date, to_date
           FROM reservations ) a
  LEFT JOIN ( SELECT object_id, from_date, to_date
           FROM reservations ) b
    ON b.object_id = a.object_id
WHERE a.object_id = '311'
ORDER BY a.from_date, b.from_date
folgendes Ergebnis erzielt:
Code:
from_date 	to_date 	next
20100927 	20101007 	20100927
20100927 	20101007 	20101010
20100927 	20101007 	20101228
20100927 	20101007 	20110417
20100927 	20101007 	20110509
20100927 	20101007 	20110612
20100927 	20101007 	20110626
20100927 	20101007 	20110709
20100927 	20101007 	20110723
20100927 	20101007 	20110731
20101010 	20101023 	20100927
20101010 	20101023 	20101010
20101010 	20101023 	20101228
20101010 	20101023 	20110417
20101010 	20101023 	20110509
20101010 	20101023 	20110612
20101010 	20101023 	20110626
20101010 	20101023 	20110709
20101010 	20101023 	20110723 usw.

Geändert von madmix (27.10.2010 um 21:56:24 Uhr)
Mit Zitat antworten
  #10  
Alt 27.10.2010, 21:47:54
madmix madmix ist offline
Anfänger
 
Registriert seit: Oct 2010
Alter: 58
Beiträge: 8
AW: Mit JOIN eine Tabelle zweimal abfragen

Zitat:
Zitat von Ckaos Beitrag anzeigen
Hi

würde, wenn ich das richtig verstanden habe. nen subselect wählen
ala
Code:
SELECT a.*,
(SELECT b.`from_date` 
  AS next_von 
  FROM reservations as b where b.`from_date`>a.`from_date`) 
  AS next_von 
  FROM reservations as a
mfg

CKaos

PS:

kleiner tip wenn du Sie per phpmyadmin kopierst kannst du den create
markieren oder sie einfach per sql exportieren.

@thomas ich glaube er meine nicht die nächste id sondern den nächsten starttermin
Gibt leider '#1242 - Subquery returns more than 1 row' als Fehlermeldung und ja ich meinte den nächsten Starttermin.
Wie bereits beschrieben hat die Tabelle keine fortlaufendes ID Feld.

Danke auch für die Hilfe wg PhpMyAdmin, werd ich nächstes Mal nutzen.
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
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 aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Abfragen einer Tabelle verschneiden SirS MySQL/MySQLi 6 10.10.2010 23:22:06
zweimal COUNT in einer Tabelle Doc_McSky MySQL/MySQLi 0 17.06.2010 18:45:55
Daten nach Spalteninhalte aus anderer Tabelle sortieren paedda MySQL/MySQLi 2 14.05.2009 15:46:15
(inner join) Bezug einer Tabelle auf sich selbst braindead2000 MySQL/MySQLi 2 13.12.2007 15:08:53
mysql query mit Join problem Silencer PHP für Fortgeschrittene und Experten 4 18.03.2003 16:38:31


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


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.


© 2001-2021 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt