tomtom: MYSQL: gibt es eine solche query abfrage?

hallo!

ich beiße mir gerade die zähne an einer kombinierten db abfrage aus:

das hier ist das problem:

$result = mysql_query("SELECT * FROM ".$subbase." WHERE name='$name' AND publish='1' AND id='$sid' ORDER BY datum DESC LIMIT 3");

erklärung:

ich benötige im prinzip 3 records auf die alle eigenschaften zutreffen (also "publish" und "name"). dabei möchte ich allerdings den allerersten eintrag vorgegeben haben (aus $sid).

jetzt ist logisch was passiert. da es die id $sid nur EINMAL gibt, wird eben auch nur EIN record ausgegeben. ich hätte aber gerne diesen und 2 weitere, die nach datum folgen.

klar - mit 2 aufeinanderfolgenden querys geht das natürlich - ich frage mich aber, ob es auch mit einer einzigen funktioniert.

hoffe, jemand hat da mehr ahnung als ich
vielen dank
gruss tomtom

  1. yo,

    $result = mysql_query("SELECT * FROM ".$subbase." WHERE name='$name' AND publish='1' AND id='$sid' ORDER BY datum DESC LIMIT 3");

    das erste was mir aufällt ist, dass du wohl immer nur maximal einen datensatz bekommen wirst. da die id wohl ein eindeutiger schlüssel sein wird (vermutung) und alle bedingungen mit dem logischen AND verknüpft sind. (* ist nicht gut zu verwenden für die spaltenangabe)

    ich benötige im prinzip 3 records auf die alle eigenschaften zutreffen (also "publish" und "name"). dabei möchte ich allerdings den allerersten eintrag vorgegeben haben (aus $sid).

    nun gibt es viele wege, die zum ziel führen. ein vorschlag wäre mit union :

    (
     SELECT spaltenname,....
     FROM tabelle
     WHERE name='$name'
     AND publish='1'
     AND id='$sid'
    )
    UNION
    (
     SELECT spaltenname,....
     FROM tabelle
     WHERE name='$name'
     AND publish='1'
     ORDER BY datum
     DESC
     LIMIT 2
    )

    Ilja

    1. Hallo,

      Vielleicht im zweiten Teil noch dafuer sorgen,
      dass der (festgelegte) Eintrag aus dem ersten
      Teil nicht gleich nochmal vorkommt:

      ...
       AND id!='$sid'
       ...

      Gruesse,

      Thomas

      --
      Bitte keine Mails mit Fachfragen - dafuer gibt es das Forum!
      Ich mag es, wenn URLs verlinkt sind (</faq/#Q-19>).
      Oft gestellte PHP-Fragen beantwortet die dclp-FAQ bestens: http://www.dclp-faq.de/
    2. hallo!

      1000 dank!!! - sieht gut aus - aber irgendwie funktioniert es nicht. ich bekomme immer die fehlermeldung, daß mein query falsch ist (PHP/MYSQL):

      $result = mysql_query("(SELECT * FROM ".$subbase." WHERE name='$name' AND publish='1' AND id='$sid') UNION (SELECT * FROM ".$subbase." WHERE name='$name' AND publish='1' ORDER BY datum DESC LIMIT 2)");

      liegt das vielleicht an den klammern???

      Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in... on line 190

      weit vom ziel dürfte ich nicht mehr weg sein, oder?

      danke :-)
      gruss tomtom

      1. yo,

        war squash spielen und bin wieder da. letztlich handelt es sich um einen syntax fehler, der nicht so schwer sein sollte herauszubekommen. einfach probieren und im net nachschauen. versuch zum einen mal die klammern um die SELECT anweiseisungen wegzulassen. ausserdem solltest du konsequent sein und die variable $id auch ausserhalb der "" setzen.

        ansonsten kannst du das noch befolgen, was thoams dir geschrieben hat, wobei doppelte datensätze bei DISTINCT ohne ALL nicht vorkommen können. aber es könnte eventuell zwei anstelle von drei Datensätze rauskommen. deshalb ist sein tipp, wenn auch aus einem anderen grund, sinnvoll.

        Ilja

      2. Hallo tomtom

        hallo!

        1000 dank!!! - sieht gut aus - aber irgendwie funktioniert es nicht. ich bekomme immer die fehlermeldung, daß mein query falsch ist (PHP/MYSQL):

        Check bitte nach, welche Version von MySQL Du hast, UNION wird erst seit 4.0.0 unterstützt,
        siehe http://www.mysql.com/doc/en/UNION.html.

        $result = mysql_query("(SELECT * FROM ".$subbase." WHERE name='$name' AND publish='1' AND id='$sid') UNION (SELECT * FROM ".$subbase." WHERE name='$name' AND publish='1' ORDER BY datum DESC LIMIT 2)");

        Stelle doch zuerst Deine Abfrage in einer Variablen zusammen, z.B:

        $sql =
          "(SELECT * FROM " .
          $subbase .
          " WHERE name='$name' AND publish='1' AND id='$sid') UNION (SELECT *    FROM " .
          $subbase .
          " WHERE name='$name' AND publish='1' ORDER BY datum DESC LIMIT 2)";

        Strukturiere die SQL-Anweisung noch nach ihrem logischen Aufbau
        und gebe Sie zuerst mal aus, bevor Du

        $result = mysql_query($sql);

        verwendest.

        liegt das vielleicht an den klammern???

        Solltest Du so viel besser sehen können.

        weit vom ziel dürfte ich nicht mehr weg sein, oder?

        danke :-)

        Oh bitte!

        gruss tomtom

        Freundliche Grüße,

        Vinzenz

        PS: Prüfe bitte nach, ob Deine Tabellennamen nicht zufällig reserviert sind: http://www.mysql.com/doc/de/Reserved_words.html