2013-10-13 82 views
0

首先,我使用Doctrine2和Symfony2使用MySQL數據庫。 我有以下實體,它與其他人有關係,如你所見。Doctrine2複雜統計查詢

Pge\IncidenciasBundle\Entity\Incidencia: 
    type: entity 
    table: incidencia 
    repositoryClass: Pge\IncidenciasBundle\Entity\IncidenciaRepository 
    id: 
     id: 
     type: integer 
     generator: 
      strategy: IDENTITY 
    fields: 
     fechaInicio: 
      type: date 
      nullable: false 
      column: fecha_inicio 
     fechaFinal: 
      type: date 
      nullable: true 
      column: fecha_final 
     horaInicio: 
      type: time 
      nullable: true 
      column: hora_inicio 
     horaInicioIndisp: 
      type: time 
      nullable: true 
      column: hora_inicio_indisp 
     horaFinal: 
      type: time 
      nullable: true 
      column: hora_final 
     horaFinalIndisp: 
      type: time 
      nullable: true 
      column: hora_final_indisp 
     causa: 
      type: text 
      nullable: true 
     resumen: 
      type: string 
      length: 250 
      fixed: false 
      nullable: true 
     descripcion: 
      type: text 
      nullable: true 
     solucion: 
      type: text 
      nullable: true 
     remedy: 
      type: string 
      length: 250 
      fixed: false 
      nullable: true 
     accionesRealizadas: 
      type: text 
      nullable: true 
      column: acciones_realizadas   
    manyToOne: 
     prioridad: 
      targetEntity: Prioridad 
     estado: 
      targetEntity: Estado 
     indisponibilidad: 
      targetEntity: Indisponibilidad 
     cliente: 
      targetEntity: Cliente 
      inversedBy: incidencia 
     servicio: 
      targetEntity: Servicio 
    lifecycleCallbacks: { } 

我試圖做一個查詢,我檢索數據給出的日期,這個輸出(圖像是在HTML中的手工表)

enter image description here

所以,對於每一個Cliente我需要每行中打印的表格,其Servicio,併爲每個Prioridad的發現Incidencia這樣一個計數器,如果有3 IncidenciaPrioridad = P0,1 Prioridad = P1和2 Prioridad = P3Servicio = KOSMOSCliente = Someone,該表將輸出這個

Someone 
       SERVICIO P0 P1 P2 P3 
       KOSMOS  3 1 0 2 

它只是作爲簡單的,但我的問題是,我無法找到產生這種查詢的方式......我試圖創建多個磁盤陣列與一些foreachs和一些querys的東西,創建一個Cliente分離的數組,併爲每個日期,服務等數組,但我找不到方法來計數Prioridad,這顯然不是一個好的做法,因爲有約8個foreach,foreach內查詢等...所以不好,但我真的迷失了...

我認爲必須有一個簡單的方法來做到這一點,但不是我的知識...

回答

1

我顯然不能測試這個查詢,所以你可能需要玩它,但基本上我們使用COUNT和多個groupBy子句。另外,我只是在SO答覆框中輸入了這個,所以請原諒。

$queryBuilder->select('incidencia, COUNT(incidencia.id) AS incidencia_count, prioridad, cliente, servicio') 
    ->from('Pge\IncidenciasBundle\Entity\Incidencia', 'incidencia') 
    ->leftJoin('incidencia.prioridad', 'prioridad', 'WITH', 'prioridad = incidencia.prioridad') 
    ->leftJoin('incidencia.cliente', 'cliente', 'WITH', 'cliente = incidencia.cliente') 
    ->leftJoin('incidencia.servicio', 'servicio', 'WITH', 'servicio = incidencia.servicio') 
    ->groupBy('prioridad.id, cliente.id, servicio.id'); 

(你可以轉換到DQL如果你想,只是覺得它更容易使用QB較長/更復雜的查詢)

我不知道你用的是什麼領域的日期,但只是將其添加爲查詢的where子句。

您最終得到的結果是每個優先排序的incidencia數量的行數,但也適用於每個客戶和服務商。

e.g(簡體)

prioridad | cliente | servicio | incidencia_count 
    p0 | someone | kosmos |  3 
    p1 | someone | kosmos |  1 
    p2 | someone | kosmos |  0 
    p3 | someone | kosmos |  2 

就遍歷這些數據來建立你的看法。