2017-05-02 2 views
1

I sequelize in NodeJS verwenden, und ich habe diesen Code:Sequelize Grenze und Offset falsche Platzierung in Abfrage

Time_Sheet_Details.findAll({ 
include: [ 
    { 
     model: timesheetNotesSubcon, 
     required: false, 
     attributes:["note","file_name", "id", "working_hrs", "timestamp", "has_screenshot", "notes_category"] 
    }, 
    { 
     model: Timesheet, 
     attributes:["id","leads_id","userid"], 
     include:[ 
      { 
       model: Lead_Info, attributes:["id","fname","lname","email","hiring_coordinator_id","status"], 
       where: { hiring_coordinator_id : 326}, 
       include:[{ 
        model: adminInfoSchema, 
        required: false, 
        attributes:["admin_id","admin_fname", "admin_lname", "admin_email", "signature_contact_nos", "signature_company"],  
       }] 

      }, 
      {model:Personal_Info,attributes:["userid","fname","lname","email"]} 
     ], 
    }], 
where: { 
    reference_date: filters.reference_date 
}, 
order:[ 
    ["id","DESC"] 
], 
offset:((1-1)*30), 
limit : 30, 

}).then(function(foundObject){ 
    willFulfillDeferred.resolve(foundObject); 
}); 

Und das Ergebnis Abfrage ist:

SELECT `timesheet_details`.*, `timesheet_notes_subcons`.`note` AS `timesheet_notes_subcons.note`, `timesheet_notes_subcons`.`file_name` AS `timesheet_notes_subcons.file_name`, `timesheet_notes_subcons`.`id` AS `timesheet_notes_subcons.id`, `timesheet_notes_subcons`.`working_hrs` AS `timesheet_notes_subcons.working_hrs`, `timesheet_notes_subcons`.`timestamp` AS `timesheet_notes_subcons.timestamp`, `timesheet_notes_subcons`.`has_screenshot` AS `timesheet_notes_subcons.has_screenshot`, `timesheet_notes_subcons`.`notes_category` AS `timesheet_notes_subcons.notes_category`, `timesheet.lead`.`id` AS `timesheet.lead.id`, `timesheet.lead`.`fname` AS `timesheet.lead.fname`, `timesheet.lead`.`lname` AS `timesheet.lead.lname`, `timesheet.lead`.`email` AS `timesheet.lead.email`, `timesheet.lead`.`hiring_coordinator_id` AS `timesheet.lead.hiring_coordinator_id`, `timesheet.lead`.`status` AS `timesheet.lead.status`, `timesheet.lead.admin`.`admin_id` AS `timesheet.lead.admin.admin_id`, `timesheet.lead.admin`.`admin_fname` AS `timesheet.lead.admin.admin_fname`, `timesheet.lead.admin`.`admin_lname` AS `timesheet.lead.admin.admin_lname`, `timesheet.lead.admin`.`admin_email` AS `timesheet.lead.admin.admin_email`, `timesheet.lead.admin`.`signature_contact_nos` AS `timesheet.lead.admin.signature_contact_nos`, `timesheet.lead.admin`.`signature_company` AS `timesheet.lead.admin.signature_company`, `timesheet.personal`.`userid` AS `timesheet.personal.userid`, `timesheet.personal`.`fname` AS `timesheet.personal.fname`, `timesheet.personal`.`lname` AS `timesheet.personal.lname`, `timesheet.personal`.`email` AS `timesheet.personal.email` FROM (SELECT `timesheet_details`.`id`, `timesheet_details`.`timesheet_id`, `timesheet_details`.`day`, `timesheet_details`.`total_hrs`, `timesheet_details`.`adj_hrs`, `timesheet_details`.`regular_rostered`, `timesheet_details`.`hrs_charged_to_client`, `timesheet_details`.`diff_charged_to_client`, `timesheet_details`.`hrs_to_be_subcon`, `timesheet_details`.`diff_paid_vs_adj_hrs`, `timesheet_details`.`status`, `timesheet_details`.`reference_date`, `timesheet`.`id` AS `timesheet.id`, `timesheet`.`leads_id` AS `timesheet.leads_id`, `timesheet`.`userid` AS `timesheet.userid` FROM `timesheet_details` AS `timesheet_details` LEFT OUTER JOIN `timesheet` AS `timesheet` ON `timesheet_details`.`timesheet_id` = `timesheet`.`id` WHERE (`timesheet_details`.`reference_date` >= '2016-04-23 16:00:00' AND `timesheet_details`.`reference_date` < '2017-05-02 15:59:59') ORDER BY `timesheet_details`.`id` DESC LIMIT 0, 30) AS `timesheet_details` LEFT OUTER JOIN `timesheet_notes_subcon` AS `timesheet_notes_subcons` ON `timesheet_details`.`id` = `timesheet_notes_subcons`.`timesheet_details_id` INNER JOIN `leads` AS `timesheet.lead` ON `timesheet.leads_id` = `timesheet.lead`.`id` AND `timesheet.lead`.`hiring_coordinator_id` = 326 LEFT OUTER JOIN `admin` AS `timesheet.lead.admin` ON `timesheet.lead`.`hiring_coordinator_id` = `timesheet.lead.admin`.`admin_id` LEFT OUTER JOIN `personal` AS `timesheet.personal` ON `timesheet.userid` = `timesheet.personal`.`userid` ORDER BY `timesheet_details`.`id` DESC; 

Wie Sie sehen können, die LIMIT 0, 30 ist nicht am Ende der Abfrage. Das ist für mich ein Problem, weil die Abfrage nichts zurück, und die Grenze und Offset sollte am Ende der Abfrage wie folgt sein:

SELECT `timesheet_details`.*, `timesheet_notes_subcons`.`note` AS `timesheet_notes_subcons.note`, `timesheet_notes_subcons`.`file_name` AS `timesheet_notes_subcons.file_name`, `timesheet_notes_subcons`.`id` AS `timesheet_notes_subcons.id`, `timesheet_notes_subcons`.`working_hrs` AS `timesheet_notes_subcons.working_hrs`, `timesheet_notes_subcons`.`timestamp` AS `timesheet_notes_subcons.timestamp`, `timesheet_notes_subcons`.`has_screenshot` AS `timesheet_notes_subcons.has_screenshot`, `timesheet_notes_subcons`.`notes_category` AS `timesheet_notes_subcons.notes_category`, `timesheet.lead`.`id` AS `timesheet.lead.id`, `timesheet.lead`.`fname` AS `timesheet.lead.fname`, `timesheet.lead`.`lname` AS `timesheet.lead.lname`, `timesheet.lead`.`email` AS `timesheet.lead.email`, `timesheet.lead`.`hiring_coordinator_id` AS `timesheet.lead.hiring_coordinator_id`, `timesheet.lead`.`status` AS `timesheet.lead.status`, `timesheet.lead.admin`.`admin_id` AS `timesheet.lead.admin.admin_id`, `timesheet.lead.admin`.`admin_fname` AS `timesheet.lead.admin.admin_fname`, `timesheet.lead.admin`.`admin_lname` AS `timesheet.lead.admin.admin_lname`, `timesheet.lead.admin`.`admin_email` AS `timesheet.lead.admin.admin_email`, `timesheet.lead.admin`.`signature_contact_nos` AS `timesheet.lead.admin.signature_contact_nos`, `timesheet.lead.admin`.`signature_company` AS `timesheet.lead.admin.signature_company`, `timesheet.personal`.`userid` AS `timesheet.personal.userid`, `timesheet.personal`.`fname` AS `timesheet.personal.fname`, `timesheet.personal`.`lname` AS `timesheet.personal.lname`, `timesheet.personal`.`email` AS `timesheet.personal.email` FROM (SELECT `timesheet_details`.`id`, `timesheet_details`.`timesheet_id`, `timesheet_details`.`day`, `timesheet_details`.`total_hrs`, `timesheet_details`.`adj_hrs`, `timesheet_details`.`regular_rostered`, `timesheet_details`.`hrs_charged_to_client`, `timesheet_details`.`diff_charged_to_client`, `timesheet_details`.`hrs_to_be_subcon`, `timesheet_details`.`diff_paid_vs_adj_hrs`, `timesheet_details`.`status`, `timesheet_details`.`reference_date`, `timesheet`.`id` AS `timesheet.id`, `timesheet`.`leads_id` AS `timesheet.leads_id`, `timesheet`.`userid` AS `timesheet.userid` FROM `timesheet_details` AS `timesheet_details` LEFT OUTER JOIN `timesheet` AS `timesheet` ON `timesheet_details`.`timesheet_id` = `timesheet`.`id` WHERE (`timesheet_details`.`reference_date` >= '2016-04-23 16:00:00' AND `timesheet_details`.`reference_date` < '2017-05-02 15:59:59') ORDER BY `timesheet_details`.`id` DESC) AS `timesheet_details` LEFT OUTER JOIN `timesheet_notes_subcon` AS `timesheet_notes_subcons` ON `timesheet_details`.`id` = `timesheet_notes_subcons`.`timesheet_details_id` INNER JOIN `leads` AS `timesheet.lead` ON `timesheet.leads_id` = `timesheet.lead`.`id` AND `timesheet.lead`.`hiring_coordinator_id` = 326 LEFT OUTER JOIN `admin` AS `timesheet.lead.admin` ON `timesheet.lead`.`hiring_coordinator_id` = `timesheet.lead.admin`.`admin_id` LEFT OUTER JOIN `personal` AS `timesheet.personal` ON `timesheet.userid` = `timesheet.personal`.`userid` ORDER BY `timesheet_details`.`id` DESC LIMIT 0, 30; 

Gibt es etwas, was ich in meinem Code falsch mache? Habe ich die Bestellung verlegt und limitiert?

+0

1. Können Sie versuchen, das 'include' Attribut zu entfernen? 2. Was meintest du, als du sagtest: "Diese Abfrage wird nichts zurückgeben?" Wenn Sie die Ergebnisse nicht einschränken, gibt die Abfrage _should_ etwas zurück ... –

+0

@MariaInesParnisari Hi. Danke für die Antwort. Das Include kann nicht entfernt werden. Ich brauche alle Attribute darin. Was ich damit meine, gibt nichts zurück wegen des Limits bevor die Anfrage endet. Ich brauche das Limit am Ende der Abfrage, nicht vorher. – Yassi

+0

Ah lol ich sehe, ich habe nicht die gesamte Ergebnisabfrage gesehen. –

Antwort

0

Need einen Auftrag zu vergeben und wo Klausel vor includes.Do so etwas wie dieses

user.findAll({ 
      offset: 5, limit: 5, 
      order: [ 
// Will escape full_name and validate DESC against a list of valid direction parameters 
['full_name', 'DESC']] 
     }).then(function (result) { 
}) 

die resultierende Abfrage

enter image description here

sein, wenn Sie die Bestellung gehören setzen wollen, dann Sie muss die Bestellung im Include-Teil enthalten

include: [{ 
       model: taskhelpers, required: true, 
       order: { 
        order: '`updatedAt` ASC' 
       } 
      }] 

für mehr Details Check Pagination/Limiting and ordering

aktualisiert verschachtelt sind und zu begrenzen und um

var option = { 
       offset: 5, limit: 5, 
      order: [ 
// Will escape full_name and validate DESC against a list of valid direction parameters 
['id', 'DESC']], 
       attributes: [ 
        'id', 'title', 
        [sequelize.Sequelize.fn('date_format', sequelize.Sequelize.col('date'), '%d-%b-%Y'), 'date'] 
       ], 

       include: [ 

        { 
         model: taskhelpers, required: true, 

         where: { 
          userId: req.params.userid, 

          $or: [ 
           { 
            status: { 
             $eq: "1" 
            } 
           }, 
           { 
            status: { 
             $eq: "3" 
            } 
           }, 
          ] 
         } 

        }] 
      }; 

jetzt diese Option, um Ihre Modellparameter

tasks.findAll(options) 
    .then(function (result) { 
     res.send({message:result,error:null}); 
    }) 
     .catch(function (err) { 
      res.send({message:null,error:err}); 
     }) 

dies wird die erzeugte Abfrage

passieren

enter image description here

+0

Danke für das Beispiel aber ich habe auch versucht das Limit und Offset am Anfang des Codes zu setzen, davor gehört aber noch kein Glück. In Ihrem Beispiel, denke ich, wird es gut funktionieren, weil es nicht verschachtelt ist und nicht mehrere innere Joins hat? – Yassi

+0

Benötigen Sie Ihr Modell, bevor Sie es aufnehmen? – Adiii

2

Ich habe eine Antwort auf meine Frage gefunden, ich muss nur die subQuery = false hinzufügen, so dass die Grenze und der Offset nicht zur Unterabfrage ausgewertet werden. Und der Offset und der Grenzwert sind auch am Ende der Abfrage.

offset:((page-1)*limit), 
limit : limit, 
subQuery:false