Ignorieren von Datensätzen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Ignorieren von Datensätzen

    Grüß euch.

    Ich bin durch Goggle auf dieses Forum gestoßen und hoffe nun auf eure Hilfe.

    Folgendes. Ich habe 2 Tabellen. Einmal für positionen und einmal für Punkte.
    Nun lese ich aus der positionstababelle alles aus und Prüfe ob für Heute (2stelliges Tagesdatum 21) jemand Punkte bekommt.

    Quellcode

    1. $pay_list = array();
    2. $Database->sql('SELECT p.*, c.* FROM
    3. ' . POSITION . ' AS p,
    4. ' . USER . ' AS u
    5. WHERE p.customers_id = u. user_id
    6. AND p.pay_day =:1');
    7. $Database->execute(date('d'));
    8. while ($row = $Database->fetch_ary()) {
    9. $pay_list[] = $row;
    10. }


    Diese Abfrage gibt mir nun alle User aus die heute Punkte erhalten.
    Jetzt würde ich gerne Anhand der positions ID (p_id aus der positionstabelle) und des Datums 2012-04-21, beides wurde in die points tabelle geschrieben prüfen ob bereits für heute punkte gut geschrieben wurden und nurnoch die ausgeben die heute keine Punkte bekommen haben.

    Es müsste also die obige Abfrage erweitert werden oder neue hinzukommen. Wie dem auch sei, ich stehe auf dem Schlauch und komme seit 2 Tagen nicht weiter.

    LG
  • Hi,
    erlaube mir deine obige Abfrage etwas umzuschreiben. Ich ersetze die Komma Syntax (Cross Join) durch einen INNER JOIN. Das Ergebnis ändert sich nicht.

    Quellcode

    1. SELECT p.*, c.*
    2. FROM xx_user AS u
    3. LEFT JOIN xx_position AS p ON p.customers_id = u. user_id
    4. WHERE p.pay_day = :1


    Ausgehend von diesem Query ist es nun ganz einfach die Benutzer auszulesen, die noch keine Punkte haben.
    Dazu nehmen wir die Datumsabfrage in die Join Bedingung, nutzen LEFT JOIN statt INNER JOIN und nutzen die Bedingung ISNULL(p.user_id)

    Quellcode

    1. SELECT p.*, c.*
    2. FROM xx_user AS u
    3. LEFT JOIN xx_position AS p ON (p.customers_id = u.user_id AND p.pay_day = :1)
    4. WHERE ISNULL(p.user_id)


    Achso: Gehört eigentlich ins Datenbank Forum. Habe den Thread verschoben.
  • HiHo,

    Musste diese noch was Anpassen

    Quellcode

    1. SELECT p.*, c.*
    2. FROM xx_user AS u
    3. LEFT JOIN xx_position AS p


    war Fehlerhaft. c durch p Ersetzten.
    Diese Abfrage zeigt mir aber nun alle an die in den nächsten Tagen Punkte erhalten, nicht Heute.
    Problem ist auch, ich habe eine Punkte Tabelle names points, anhand dieser soll abfegraft werden (datum und user_id) ob für heute schon Punkte vergeben worden sind, wen nnicht dann nach holen.

    Dies habe ich in meinem ersten Post nicht drinne weil dies noch Fehlt und ich deswegen hier Hilfe benötige.

    Meine erste Abfrage im 1 Post gibt mir ja bereits die User aus die heute Punkte erhalten nur fehlt dort die Prüfung ob der user für heute schon punkte erhalten hat, wen nnein dann punkte vergeben.
    Diese Abfrage müsste also noch mit der points tabelle erweitert werden wo anhand vom Datum 2012-04-25 und der user id geprüft werden muss
  • Quellcode

    1. SELECT u.*, p.*
    2. FROM xx_user AS u
    3. LEFT JOIN xx_position AS p ON (p.customers_id = u.user_id AND p.pay_day = :1)
    4. WHERE ISNULL(p.user_id)


    Diese Abfrage zeigt mir aber nun alle an die in den nächsten Tagen Punkte erhalten, nicht Heute.

    in u.* sind alle User die heute keine Punkte erhalten haben
    Dazu gehören die, die an andere Tagen Punkte haben und die, die noch nie Punkte erhalten haben.

    Also alles so, wie du willst, oder?
  • Also alles so, wie du willst, oder?


    Nicht ganz.
    xxx_user, in dieser stehen user_id, pw, email etc. Standard Usertabelle eines Forums eben.
    xxx_position, in dieser steht drinne wieviele Punkte der User bekommt und wann ( date('d') )

    xxx_points, in dieser werden die Punkte rein geschrieben die ein user heute erhällt. Für jeden EIntrag von Punkten eine neue Spalte. Mit dieser Tabelle soll auch geprüft werden ob ein user heute punkte bekommen hat und wenn nicht dann gut schreiben.

    Man kann das Vergleichen mit einer Faktura. In xxx_position steht zb drinne was der Kunde bestellt hat etc. Jeden Tag wird dann anhand dieser Tabelle geprüft ob eine Rechnung ansteht. Wenn ja, prüfen in der tabelle xxx_points ob für heute diese Rechnung erstellt wurde, wenn nicht dann Erstellen und Rechnungsdaten in die xxx_points eintragen.

    Ich hoffe das bsp mit der Faktura ist übersichtlicher.

    Ich müsste also ein LEFT JOIN über 3 Tabellen anlegen.
    Prüfen ob für heute eine aktion ansteht (Tabelle xxx_position und spalte pay_date mit dem Inhalt 28 für heute)
    Wenn ja, prüfen in Tabelle xxx_points anhand von p_id (positions_id aus Tabelle position) und datum für heute 2012-04-28 ob punkte vergeben worden sind, wenn nein, punkte in xxx_points rein schreiben

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von SoulRider ()