Maison  >  Article  >  développement back-end  >  Besoin d'exclure les identifiants présents dans la première table de la deuxième table

Besoin d'exclure les identifiants présents dans la première table de la deuxième table

PHPz
PHPzavant
2024-02-11 14:33:08885parcourir

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

l'éditeur php Yuzai est là pour vous présenter une question sur le traitement des données. Lorsque nous devons exclure d'une table les identifiants qui existent déjà dans une autre table, nous pouvons le faire via une méthode spécifique. Ce problème est très courant dans le traitement des données. Le résoudre peut nous aider à mieux organiser et traiter les données, et à améliorer l'efficacité et la précision du traitement des données. Dans le prochain article, nous détaillerons comment atteindre cet objectif en utilisant des instructions de requête spécifiques.

Contenu des questions

Les gars, j'ai encore besoin de votre aide. Mon cerveau est brisé et je ne comprends pas ce que j'ai fait de mal. J'ai 2 tables

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"`

En tant que destinataire, j'ai un identifiant d'utilisateur et je dois trouver toutes les demandes des utilisateurs entre la date de début et la date de fin, mais les demandes avec le statut « annulée » ou « refusée » doivent être exclues. Je pensais pouvoir utiliser la jointure gauche, mais cela ne fonctionne pas comme j'en ai besoin. Actuellement, j'ai la requête suivante :

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()

Actuellement, je reçois toutes les données du tableau étudiant pour la date souhaitée, mais même si le statut dans le tableau des demandes est « Annulé » ou « Rejeté », il n'est pas exclu des résultats. Si vous avez besoin d'informations supplémentaires de ma part pour vous aider, n'hésitez pas à me le faire savoir. Merci pour vos commentaires et suggestions.

Solution de contournement

Vous devez vous assurer d'appliquer correctement la clause where pour exclure les demandes avec le statut « Annulé » ou « Rejeté ».

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()

J'utilise not exists 子查询来检查在 requests 表中具有相同 request_id 的请求,并且其状态存在于 status en tranche. Si de telles requêtes sont trouvées dans la sous-requête, elles seront exclues du résultat final.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer