Abfrage aus zwei Tabellen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
ausgabe
beispiel
code
dank
date
datum
ergebnis
frage
http
limit
ordern
ordnen
ort
spalten
spieltag
tabelle
termin
union
url
-
Hallo, ist es möglich eine Abfrage aus zwei Tabellen "über kreuz" zu ordnen?
Als Beispiel, ich frage auf einer Sportseite einmal die nächsten 10 Termine ab und die nächsten 10 Spieltage. tbl_termine und tbl_spieltage meinetwegen. Beide haben den Wert "datum" (timestamp) und ich würde gerne die nächsten 10 Termine UND Spieltage in einer Tabelle ausgeben. So dass auch meinetwegen erst 3 Termine und dann 2 Spieltage, und darauf 5 weitere Termine folgen.
Ich hab zwar die Suchfunktion benutzt, nur wenn man nicht genau weiß wonach man sucht ...
Grüße,
Jan -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Wenn in beiden Tabellen die Spalte datum den gleichen Namen hat,
kannst Du mit AS die Spalten-Namen für die Ausgabe umbenennen
ungefähr so
$sql = "SELECT tbl_termine.datum AS datum1, tbl_spieltage.datum AS datum2, tbl_termine.ort, tbl_spieltage.verein FROM tbl_termine, tbl_spieltage WHERE tbl_termine.datum > '":$startdate."' AND tbl_termine.datum < '":$enddate."' AND tbl_spieltage.datum > '":$startdate."' AND tbl_spieltage.datum < '":$enddate."' ORDER BY ..... LIMIT 10";
Die SELECT Abfrage kannst du natürlcih ändern / erweitern um die Spalten zu holen die Du brauchst
Die WHERE Abfrage musst Du natürlich an Deine Struktur anpassen
also hier im BSP Termine zwischen einem startDatum und einem endeDatum
dafür gib es aber sicher bessere Möglichkeiten ... z.B. BETWEEN oder sowas
was Du mit "über kreuz" ordnen meinst, musst Du nochmal erklären
evtl kannst Du die Daten ja auch nach der Abfrage im Array entsprechend sortieren
Beitrag zuletzt geändert: 6.10.2011 11:35:48 von spiele2u -
OK. Wo es spannend wird brichst du ab. ORDER BY. Was soll da nun hin. datum1, datum2?
-
nein, datum1 und datum2 sind dann in der Ausgabe, aber nicht für die Abfrage,
in der Abfrage musst du (glaub ich) die Spalten direkt ansprechen (bin mir nicht 100% sicher)
probier's aus :)
als Beispiel evtl. so machen (mehrere Sortierungen durch Komma getrennt)
... ORDER BY tbl_spieltage.datum ASC, tbl_termine.datum ASC ...
kommt drauf an, wie herum du es brauchst .... oOo ... geiler Satz :xD
... gemeint ist ASC oder DESC (aufsteigende oder absteigende Reihenfolge)
Frage: warum eigentlich nicht so:
--> Suche je Spieltag wo Datum in Termine ist gleich Spieltag-Datum ?
also je Spieltag eine eigene Abfrage, also alle Termine zum Spieltag
$sql = "SELECT tbl_termine.datum, tbl_termine.ort, tbl_termine.wasauchimmer FROM tbl_termine, tbl_spieltage WHERE DAYOFYEAR(tbl_termine.datum) = DAYOFYEAR(tbl_spieltage.datum) ORDER BY tbl_termine.datum ASC LIMIT 10";
so bekommst Du alle Termine für einen Spieltag (zu einem Datum aus tbl_spieltage)
DAYOFYEAR() gibt Dir einen Wert zwischen 1 und 366
... evtl eine Fehlerquelle bei Saison über Jahreswechsel
vielleicht kennt hier jemand anderes dafür ne bessere Lösung !!!! .... ist nur ne Idee von mir
aber vom Prinzip her ... Alle Termine die am gleichen Tag sind wie der Spieltag
und dann halt für 10 Spieltage 10 Abfragen
PS:
ich weiss ja nicht was noch wichtiges in tbl_spieltage drein steckt (ausser das Datum)
Beitrag zuletzt geändert: 6.10.2011 13:22:50 von spiele2u -
Ich habs noch nich ausprobiert, deswegen ist dsa vielleicht überflüssig.
Die Spieltage stehen nicht mit in den Terminen. Es gibt Spieltage und Termine. Logisch betrachtet sind beides Termine, aber die haben halt jeder eine eigene Tabelle wegen der unterschiedlichen Attribute. Nun sollen in der Liste die nächsten 10 Termine (mitunter der Spieltage) ausgegeben werden. Problem war halt das ich hätte erst die Termine und dann die Spieltage ausgeben können, aber nicht meinetwegen am 1. ein termin, am 3. einen spieltag und am 14. wieder einen termin, da die Abfragen nicht "parallel" stattfinden konnten sondern nacheinander. Ich probiere das zuhause gleich mal aus.
Danke soweit schonmal.
UPDATE
Meine Abfrage. Nur da bekomme ich nur Scheiße bei raus. Sieht so aus wie immer wieder die selben Werte. Ich glaube ich brauch noch eine andere Abfrage. Ich hab gerade was von LEFT JOIN oder so gehört. Wäre das noch was?
SELECT tbl_termine.datum, tbl_spieltage.datum, tbl_termine.terminID AS id, tbl_spieltage.spieltagID AS id, tbl_termine.name, tbl_termine.spieltagNR AS name, FROM tbl_termine, tbl_spieltage WHERE tbl_termine.date > time() AND tbl_spieltage.date > ".time()." ORDER BY tbl_termine.date, tbl_spieltage.date LIMIT 10
Beitrag zuletzt geändert: 6.10.2011 14:15:02 von h4nni -
Ich habe bis lang immer mit JOIN gearbeitet, wenn ich aus 2 Tabellen auf einmal lesen muss. Hier ist ein Tutorial mit Beispiel darüber: http://tut.php-quake.net/de/pm.html#s3
-
also das ist schonmal Quatsch
h4nni schrieb:
SELECT tbl_termine.datum, tbl_spieltage.datum, tbl_termine.terminID AS id, tbl_spieltage.spieltagID AS id,
so hast Du die Felder datum und id im Ergebnis doppelt, kann nur Zitat: Scheiße bei raus kommen
mit AS kannst Du ja neue Namen für das Ergebnis zuweisen,
z.B. mit einem Prefix (z.B. erster Buchstabe der tabelle und Unterstrich)
SELECT tbl_termine.datum AS t_datum, tbl_spieltage.datum AS s_datum, tbl_termine.terminID AS t_id, tbl_spieltage.spieltagID AS s_id,
dann zu
WHERE tbl_termine.date > time() AND tbl_spieltage.date > ".time()."
das zweite time() ist escaped, das erste nicht, beides nicht in einfachen Anführungszeichen
kann ja nur "Scheiße" liefern
ist auch die Frage in welchem Format Du Dein Datum in der Tabelle hast, als Date-String oder als Timestamp?
Vergleich mit time() geht nur mit Timestamp in der Tabelle
am besten Du schreibst hier mal die Struktur der Tabellen, mit Beispiel-Daten (z.B. 4 Termine, 2 Spieltage)
dann kann man evtl auch eine passende Abfrage für Dich finden, so ist es eher ein Rate-Spiel
Beitrag zuletzt geändert: 6.10.2011 19:27:37 von uhrinfo -
so hast Du die Felder datum und id im Ergebnis doppelt
Nun ja, es soll ja nur ein Termin ODER ein Spieltag ausgegeben werden. Quasi abwechselnd. Ich kanns nicht nochmal erklären. Die Datums Attribute sind als Timestamp gespeichert. Das ist nicht die orginal Abfrage, deswegen fehlen bei dem einem time() die Anführungszeichen.
tbl_termine termin_id - name - ort - datum - url - linkname - kategorie- beschreibung (253, 'Buxte-Cup', 'Buxtehude', 1301180399, 'http://www.homepage.de', 'Offizielle Homepage', 'Turnier', 'Mehr auf der offiziellen Homepage (siehe Link)') tbl_spieltage spieltag_id -saison - heim - gast - date - ort - spieltag - spielpunkte - spiele_heim - spiele_gast - saetze - bericht (248, 2012, '163', '167', '1318197599', 'Ort', 3, 134:352, 3, 5, 14:2, 'Ja das war ein toller Spieltag'),
Ich glaube es ist noch nicht so ganz rüber gekomen was ich möchte ... Beispiel Ausgabe wäre:
9.10. Treffen im Kaffe (Termin)
10.10. 3. Spieltag (spieltag)
22.10. 4. Spieltag (spieltag)
11.11. Kaffee und Kuchen bei Tante Herta (Termin)
PS. Den JOIN hab ich mir noch nicht angeguckt.
Beitrag zuletzt geändert: 7.10.2011 9:22:32 von h4nni -
bei solchen themen helfen die folgenden funktionen von inner join, left join und right join recht gut.
du kannst den tabellen (mit as ...) auch neue namen geben, dann brauchst du nicht immer so viel zu schreiben. -
So ok, jetzt hab ich mir das auch nochmal mit Inner / Left / Right Join durchgelesen. Das funktioniert so nicht. Die Datensätze aus TBLspieltage und TBLtermine sind nicht miteinander verbunden. Lediglich haben beide ein Datumsattribut im Timestamp-Format. Die ausgabe soll nun sortiert nach dem Datum ausgegeben werde. Also der Innerjoin passt hier auch nicht.
-
Hallo h4nni,
wenn Du den JOIN jetzt schon kennst, dann schau Dir doch mal den UNION an
( SELECT tbl_termine.id AS id, tbl_termine.datum AS datum, tbl_termine.name AS name, FALSE AS spieltag FROM tbl_termine) UNION ( SELECT tbl_spieltage.id AS id, tbl_spieltage.date AS datum, CAST(tbl_spieltage.spieltag AS CHAR) AS name, TRUE AS spieltag FROM tbl_spieltage) ORDER BY datum LIMIT 10;
-
Ai. Gut. Bisher war noch nichts dabei, aber dieses UNION ... das scheint zu funktionieren und auch das zu sein, nach dem ich gesucht habe!
Danke allen für die Hilfe. darkpandemic hat die Lösung gepostet. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage