kostenloser Webspace werbefrei: lima-city


Abfrage aus zwei Tabellen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    h4nni

    h4nni hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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
  4. Autor dieses Themas

    h4nni

    h4nni hat kostenlosen Webspace.

    OK. Wo es spannend wird brichst du ab. ORDER BY. Was soll da nun hin. datum1, datum2?
  5. 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
  6. Autor dieses Themas

    h4nni

    h4nni hat kostenlosen Webspace.

    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
  7. 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
  8. 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
  9. Autor dieses Themas

    h4nni

    h4nni hat kostenlosen Webspace.

    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
  10. 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.
  11. Autor dieses Themas

    h4nni

    h4nni hat kostenlosen Webspace.

    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.
  12. 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;
  13. Autor dieses Themas

    h4nni

    h4nni hat kostenlosen Webspace.

    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.
  14. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!