nur Select bei bestimmten 2 fachen Zeilen
Tim
- datenbank
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
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
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
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
Hab grade weiter oben in einem Thread entdeckt das Ihr die brauchen könnt ;-)
MySQL 3.23.44
Viele Grüsse
Tim
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
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