Heim  >  Artikel  >  Backend-Entwicklung  >  In der ersten Tabelle vorhandene IDs müssen von der zweiten Tabelle ausgeschlossen werden

In der ersten Tabelle vorhandene IDs müssen von der zweiten Tabelle ausgeschlossen werden

PHPz
PHPznach vorne
2024-02-11 14:33:08880Durchsuche

需要从第二个表中排除第一个表中存在的 id

php-Redakteur Yuzai ist hier, um Ihnen eine Frage zur Datenverarbeitung vorzustellen. Wenn wir IDs aus einer Tabelle ausschließen müssen, die bereits in einer anderen Tabelle vorhanden sind, können wir dies mit einer bestimmten Methode tun. Dieses Problem tritt sehr häufig bei der Datenverarbeitung auf und kann uns dabei helfen, Daten besser zu organisieren und zu verarbeiten sowie die Effizienz und Genauigkeit der Datenverarbeitung zu verbessern. Im folgenden Artikel werden wir detailliert beschreiben, wie Sie dieses Ziel mithilfe spezifischer Abfrageanweisungen erreichen können.

Frageninhalt

Leute, ich brauche wieder eure Hilfe. Mein Gehirn ist kaputt und ich verstehe nicht, was ich falsch gemacht habe. Ich habe 2 Tische

requests
id string `json:"id"`
userid string `json:"user_id"`
status string `json:"status"`
students
id string `json:"id"`
userid string `json:"user_id"`
requestid string `json:"request_id"`
startdate time.time `json:"start_date"`
enddate time.time `json:"end_date"`

Als Empfänger habe ich eine Benutzer-ID und muss alle Benutzeranfragen zwischen Startdatum und Enddatum finden, aber Anfragen mit dem Status „storniert“ oder „abgelehnt“ sollten ausgeschlossen werden. Ich dachte, ich könnte Left Join verwenden, aber es funktioniert nicht so, wie ich es brauche. Aktuell habe ich folgende Abfrage:

status := []string{"canceled", declined"}

   type Result struct {
      tableName        struct{}  `pg:"students"`
      ID               string `json:"id"`
      UserID      int       `json:"user_id"`
      RequestID string    `pg:"fk:request_id"`
      Status           string    `json:"status"`
   }

   var res []Result

    err := Model(&res).
      ColumnExpr("id, user_id, requests.status").
      Where("user_id = ?", UseID).
      Where("start_date >= ? AND end_date <= ?", startDate, endDate).
      Join("LEFT JOIN requests ON requests.id = request_id").
      WhereIn("requests.status IN (?)", status).
      Select()

Derzeit erhalte ich alle Daten der Tabelle Student für den gewünschten Termin, aber auch wenn der Status in der Anfragetabelle „Storniert“ oder „Abgelehnt“ ist, wird er nicht aus den Ergebnissen ausgeschlossen. Wenn Sie weitere Informationen von mir benötigen, die mir helfen, lassen Sie es mich bitte wissen. Vielen Dank für alle Kommentare und Vorschläge.

Problemumgehung

Sie müssen sicherstellen, dass Sie die where-Klausel korrekt anwenden, um Anfragen mit dem Status „Storniert“ oder „Abgelehnt“ auszuschließen.

type Result struct {
    TableName  struct{}  `pg:"students"`
    ID         string    `json:"id"`
    UserID     string    `json:"user_id"`
    RequestID  string    `pg:"fk:request_id"`
    Status     string    `json:"status"`
}

var res []Result
status := []string{"canceled", "declined"}

err := Model(&res).
    ColumnExpr("students.id, students.user_id, students.request_id, requests.status").
    Where("students.user_id = ?", UserID).
    Where("students.start_date >= ? AND students.end_date <= ?", startDate, endDate).
    Where("NOT EXISTS (SELECT 1 FROM requests WHERE students.request_id = requests.id AND requests.status IN (?))", status).
    Select()

Ich verwende not exists 子查询来检查在 requests 表中具有相同 request_id 的请求,并且其状态存在于 status in Scheiben. Wenn solche Anfragen in der Unterabfrage gefunden werden, werden sie vom Endergebnis ausgeschlossen.

Das obige ist der detaillierte Inhalt vonIn der ersten Tabelle vorhandene IDs müssen von der zweiten Tabelle ausgeschlossen werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen