Tim: nur Select bei bestimmten 2 fachen Zeilen

Hallo zusammen,

ich habe mir einen Select-Befehl gebaut der mir alle Rechnungbedürftigen Kunden inkl. seiner Produkte rausfiltert.

Alle Produkte sind in Monatliche und Jährliche Zahlung unterteilt.
In diesem Fall geht es um die Jährliche Abrechnung.
Nun möchte ich ein Produkt von vielen gerne unter bestimmten Vorraussetzungen nicht selecten.
Und zwar soll der Select-Befehl nur dann anschlagen wenn Produkt "1" mindestens 2 mal in dem von mir unten angehängten Select bei einem Kunden anzufinden ist.
Wenn aber Produkt "2" nur einmal bei einem Kunden zu finden ist soll alles beim alten bleiben ;-)

$data = mysql_query ("SELECT *
 FROM login,bestellung_x
 WHERE (login.clientid = bestellung_x.client_id)
 AND (bestellung_x.zahlung = 'j')
 AND (bestellung_x.tag LIKE '18.07.2003)
 GROUP BY 1" );

Ich hoffe Ihr versteht mein wirres Gerede,,,

Ich danke euch für eure Hilfe

Und Viele Grüße an alle

Tim

  1. Halihallo Tim

    Nun möchte ich ein Produkt von vielen gerne unter bestimmten Vorraussetzungen nicht selecten.

    Das klingt nach einem GROUP BY mit HAVING, wenn es um Anzahl an Produkten der Bestellung
    geht.

    Und zwar soll der Select-Befehl nur dann anschlagen wenn Produkt "1" mindestens 2 mal in dem von mir unten angehängten Select bei einem Kunden anzufinden ist.

    Wie ist "Produkt 1" definiert? - Wie sehen die Relationen aus?
    Das klingt mir nach einem GROUP BY login.clientid und HAVING COUNT(*)>2 aber ich glaube
    nicht, dass das alles ist, was du brauchst (wird wohl etwas komplexer).

    Beschreibe genauer, was du selektieren willst und was nicht.

    Wenn aber Produkt "2" nur einmal bei einem Kunden zu finden ist soll alles beim alten bleiben ;-)

    Welches DBMS-System? - Grunsätzlich gilt: DBMS-Systeme kennen keine IF-Abfragen.

    $data = mysql_query ("SELECT *
     FROM login,bestellung_x
     WHERE (login.clientid = bestellung_x.client_id)
     AND (bestellung_x.zahlung = 'j')
     AND (bestellung_x.tag LIKE '18.07.2003)
     GROUP BY 1" );

    bestellung_x.tag LIKE '18.07.2003 ? - Da fehlt mindestens ein abschliessendes '. Aber
    wie ist das Feld tag definiert? - Daten gehören in Datumsfelder, nicht in Strings. Und
    erstere werden _nie_ mit LIKE verglichen.

    Ich hoffe Ihr versteht mein wirres Gerede,,,

    Noch nicht, hilf uns auf die Sprünge. ;-)

    Viele Grüsse

    Philipp

    --
    RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
    Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
    1. Wie ist "Produkt 1" definiert? - Wie sehen die Relationen aus?
      Das klingt mir nach einem GROUP BY login.clientid und HAVING COUNT(*)>2 aber ich glaube
      nicht, dass das alles ist, was du brauchst (wird wohl etwas komplexer).

      Denke ich auch ;-)
      Produkt eins wäre z.B. eine Domain die in der DT durch "paket_id" zu erkennen ist.
      Sagen wir also Paket1=1.1 und Paket2=1.2 ist paket_id 1.2 nicht mehr als 2 mal bei einem Kunden vorhanden soll dies nicht selectet werden.
      Erklärung dafür ist das wenn ein Paket bestellt wird ist immer 1.2 einmal "Gratis enthalten" und darf somit nicht extra berechnet werden.
      Ist 1.2 aber mehr als einmal vertreten muss dafür eine Rechnung erstellt werden ;-)

      Welches DBMS-System? - Grunsätzlich gilt: DBMS-Systeme kennen keine IF-Abfragen.

      MySQL ...

      $data = mysql_query ("SELECT *
       FROM login,bestellung_x
       WHERE (login.clientid = bestellung_x.client_id)
       AND (bestellung_x.zahlung = 'j')
       AND (bestellung_x.tag LIKE '18.07.2003)
       GROUP BY 1" );

      bestellung_x.tag LIKE '18.07.2003 ? - Da fehlt mindestens ein abschliessendes '.

      Klienr vertipper

      Aber wie ist das Feld tag definiert?

      Varchar ;-)

      erstere werden _nie_ mit LIKE verglichen.

      sorry ich bin noch nicht perfekt ;)
      Wenn ich nun angenommen einen timestamp() als String speichere müste ich diesen doch auch als String vergleichen "Like" ?
      Würde mich über Rat freuen ;-)

      Danke ;-)

      Gruss

      Tim

      1. Halihallo tim

        Produkt eins wäre z.B. eine Domain die in der DT durch "paket_id" zu erkennen ist.

        BTW: Was zum h*** ist DT und DF? - Was habt ihr denn da für Abkürzungen... ;-)

        Erklärung dafür ist das wenn ein Paket bestellt wird ist immer 1.2 einmal "Gratis enthalten" und darf somit nicht extra berechnet werden.

        Also am einfachsten wäre hier ein Attribut is_for_free mit dem Wert eins zu belegen, wenn
        etwas gratis ist. Das liesse sich mit WHERE einfach ausschliessen und die Aufgabe wäre
        halb so "komplex". Zudem willst du vielleicht mal wissen, wieviele Packete da einfach
        Gratis rausgegeben werden, wenn diese Anzahl grösser ist als der richtig verkaufte, wirds
        eng :-)

        Mal ein kleiner Ansatz für den Query:

        SELECT l.name
           FROM
              login AS l,
              bestellung_x AS b
           WHERE
              l.clientid=b.client_id AND ...
           GROUP BY
              l.clientid,b.bestellungid
           HAVING
              COUNT(*)>=2

        Sinn klar und Query halbwegs funktional?

        Welches DBMS-System? - Grunsätzlich gilt: DBMS-Systeme kennen keine IF-Abfragen.
        MySQL ...

        MySQL auch nicht :-)

        Aber wie ist das Feld tag definiert?
        Varchar ;-)

        *pfui* ändere das aber schnell in DATE/DATETIME. Daten gehören nie in VARCHAR, wenn es
        sich um den Plural von Datum handelt.

        Wenn ich nun angenommen einen timestamp() als String speichere müste ich diesen doch auch als String vergleichen "Like" ?

        a) Vergleichen von Strings auf deren Gleichheit tut man mit '=', nicht mit LIKE.
        b) timestamp ist ein SHORTINT(5) UNSIGNED, warum willst du den umbedingt in einen
           sinnfremden String verwandeln?

        Viele Grüsse

        Philipp

        --
        RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
        Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
    2. Hab grade weiter oben in einem Thread entdeckt das Ihr die brauchen könnt ;-)

      MySQL 3.23.44

      Viele Grüsse

      Tim

  2. Hi,

    <rat>

    ich habe mir einen Select-Befehl gebaut der mir alle Rechnungbedürftigen Kunden inkl. seiner Produkte rausfiltert.

    Die Kunden kommen aus der DT 'login', die Rechnungen sollen auf der Tabelle 'bestellung_x' basierend generiert werden.

    Alle Produkte sind in Monatliche und Jährliche Zahlung unterteilt.

    Klar, das DF 'zahlung' der DT 'bestellung_x'.

    In diesem Fall geht es um die Jährliche Abrechnung.

    Klar, DF 'zahlung' dann mit dem Wert 'j' fuer jeahrlich belegt. 'm' waere monatlich.

    Nun möchte ich ein Produkt von vielen gerne unter bestimmten Vorraussetzungen nicht selecten.

    Du moechtest unter bestimmten Bedingungen keine Rechnung fuer einen Kunden generieren, der eigentlich "faellig" waere.

    Und zwar soll der Select-Befehl nur dann anschlagen

    Haff, haff.

    wenn Produkt "1" mindestens 2 mal in dem von mir unten angehängten Select bei einem Kunden anzufinden ist.

    'having', 'count(*)', 'group by' helfen da traditionell.

    Wenn aber Produkt "2" nur einmal bei einem Kunden zu finden ist soll alles beim alten bleiben ;-)

    'having', 'count(*)', 'group by' helfen da traditionell.

    $data = mysql_query ("SELECT *
     FROM login,bestellung_x
     WHERE (login.clientid = bestellung_x.client_id)
     AND (bestellung_x.zahlung = 'j')
     AND (bestellung_x.tag LIKE '18.07.2003)
     GROUP BY 1" );

    </rat>

    Ich hoffe Ihr versteht mein wirres Gerede,,,

    Was ist denn Produkt '1' und Produkt '2' und 'group by 1'?

    Gruss,
    Lude

    1. Hallo Lude,

      Was ist denn Produkt '1' und Produkt '2' und 'group by 1'?

      Produkt 1 ist in der DT bestellung_x durch ein DF paket_id zu erkennen.

      Paket1=1.1
      Paket2=2.2

      Group by 1 sorgt dafür das alle vorhandenen Produkte in einen Datensatz gelangen "?" in jenem falle sammelt er dadruch alle Produkte und schreibt diese auf eine Rechnung.

      Viele Grüße

      Tim