2017-04-11 16 views
0

私は約2日間私の頭を吹き飛ばすクエリを得ました。 Pleeeaaze!MySQLのフィルタ、COUNT、GROUP BY/LIMIT/ORDER BYとサブクエリを使用したHTMLクエリ

私が行う必要があるのは、下記の表に示すデータ形式を取得することです。出力は、顧客のフィルタ(name、codeX/Y/Z)、アプリケーション(名前、ウェーブ)、migrationLabel .label、migrationMessage。(日付)ページ分割を使用する(ページあたり50)。

各アプリケーションは0からn個のメッセージを表示でき、属性「rowspan」を使用してHTMLテーブルを作成する必要があります。ここで

はテーブルです:

"#:PK"

"@:FK"

  • アプリケーション(#ID、ラベル、@CustomerID)
  • 顧客(#ID 、name、codeX、codeY、codeZ)
  • migrationMessage(@applicationId、crea tionTime、closureDate、previsionalDate、@labelId、@authorId)
  • migrationLabel(#ID、ラベル、発注)
  • 作品(@employeeId、@applicationId、@roleId)
  • 従業員(#ID、ユーザ名)
  • ここで

は、現在のクエリです:ほとんどすべては、このクエリを使用して動作します

<?php 
$query = 'SELECT 
     c.id AS customerId, c.name AS customerName, c.X3Code, c.mfgProCode, c.as400Code, c.jdeCode, 
     a.id AS appId, a.label AS appName, a.wave, 
     mm.closureDate, mm.previsionalDate, mm.content, 
     ml.id, ml.label, 
     q.msgCount 
     FROM (
      SELECT a.id 
      FROM `application` a 
      JOIN `customer` c ON c.id = a.customerId 
      ORDER BY c.name 
     ) l 
     JOIN application a ON a.id = l.id 
     JOIN `customer` c ON c.id = a.customerId 
     LEFT JOIN (
      SELECT applicationId, COUNT(*) AS msgCount 
      FROM application a 
      JOIN migrationMessage mm ON mm.applicationId = a.id 
      JOIN migrationLabel ml ON ml.id = mm.labelId 
      JOIN customer c ON c.id = a.customerId 
      ' . $where . ' 
      GROUP BY applicationId 
      LIMIT ' . $limit . ' OFFSET ' . $offset . ' 
     ) q ON q.applicationId = a.id 
     LEFT JOIN `migrationMessage`mm ON mm.applicationId = q.applicationId 
     LEFT JOIN `migrationLabel` ml ON ml.id = mm.labelId 
     JOIN `works` w ON w.applicationId = a.id ' 
     . ($user->isOperator() ? ' AND w.roleId = ' . Role::Rri : ' AND w.employeeId = ' . $user->id) 
    . ' JOIN employee e ON e.id = w.employeeId' 
     . ($user->isJustUser() ? ' AND e.siteId = ' . $user->siteId : '') 
     . $where 
     . ' ORDER BY c.name, a.label, ml.ordering' 
     . 'LIMIT ' . $limit . ' OFFSET ' . $offset; 

私は2ページに自分自身を取得するいくつかのメッセージでアプリケーションを得たときに、問題が起こる... たとえば、 "rowspan"(クエリのmsgCount)は5ですが、最後の3つのメッセージは最初の2つのページとは異なるページにあり、HTML表示は完全に間違っています。 See HTML result

答えて

0

私の質問は一から書いて、自分のニーズに完全に合った結果が得られました。不思議に思った人のために

、キーがRIGHT JOIN'edクエリです:

<?php 
$query = 'SELECT 
     c.id AS customerId, c.name AS customerName, c.X3Code, c.mfgProCode, c.as400Code, c.jdeCode, 
     a.id AS appId, a.label AS appName, a.wave, 
     mm.closureDate, mm.previsionalDate, mm.content, 
     ml.id, ml.label, 
     q0.msgCount 
     FROM application a 
     JOIN customer c ON c.id = a.customerId 
     LEFT JOIN migrationMessage mm ON mm.applicationId = a.id 
     LEFT JOIN migrationLabel ml ON ml.id = mm.labelId 
     JOIN `works` w ON w.applicationId = a.id ' 
     . ($user->isOperator() ? ' AND w.roleId = ' . Role::Rri : ' AND w.employeeId = ' . $user->id) 
    . ' JOIN employee e ON e.id = w.employeeId' 
     . ($user->isJustUser() ? ' AND e.siteId = ' . $user->siteId : '') 

    . ' LEFT JOIN (
     SELECT applicationId, COUNT(*) AS msgCount 
     FROM application a 
     JOIN migrationMessage mm ON mm.applicationId = a.id 
     JOIN migrationLabel ml ON ml.id = mm.labelId 
     JOIN customer c ON c.id = a.customerId 
     GROUP BY applicationId 
    ) q0 ON q0.applicationId = a.id 
    RIGHT JOIN (
     SELECT a.id 
     FROM application a 
     JOIN customer c ON c.id = a.customerId 
     LEFT JOIN migrationMessage mm ON mm.applicationId = a.id 
     LEFT JOIN migrationLabel ml ON ml.id = mm.labelId 
     ' . $where . ' 
     GROUP BY a.id 
     ORDER BY c.name, a.label, ml.ordering 
     LIMIT ' . $limit . ' OFFSET ' . $offset . ' 
    ) q1 ON q1.id = a.id 
    ORDER BY c.name, a.label, ml.ordering' 
関連する問題