2015-08-14 3 views
-2

я в настоящее время имеют следующие таблицы с:Упростить мой MySQL запрос

TABLE klusbonnen_deelnemers: 
bonnummer (varchar) - order number 
adres (varchar) - order adres 
deelnemer (varchar) - user 
binnen (date) - date order received 
klaar (date) - original order milestone 
datum_gereed (date) - date order completed 
gereed (varchar) - YES or NO (YES= completed NO= Not yet completed) 
datum_factuur (date) - date when user marked order completed (button clicked) 
factuur (varchar) - weeknumber order completed 

Один заказ (bonnummer) может иметь несколько пользователей (deelnemer), которые все должны пометить заказ «заполненный» (datum_gereed). Только когда ВСЕ пользователи (deelnemer) отметили заказ (bonnummer) «завершен» (datum_gereed), заказ «завершен». Я пытаюсь написать запрос, который дает мне: Все выполненные заказы (bonnummer) в заданный промежуток времени (в прошлом месяце). Однако ... Дата завершения (datum_gereed) должна содержать дату LAST (так как это фактическая общая дата завершения). Список должен иметь заказ (bonnummer) с самой последней «отмеченной завершенной» датой (datum_factuur) сверху (sort DESC) (конечно, только когда все пользователи (deelnemer) выполнили заказ (все пользователи (deelnemers), имеющие gereed = «ДА»)

до сих пор у меня есть это:

SELECT DISTINCT tbl1.bonnummer AS 'KLUSBONNUMMER', tbl1.adres AS 'ADRES', 
     tbl1.binnen AS 'BINNENGEKOMEN OP', tbl1.klaar AS 'ORIGINELE STREEFDATUM', 
     tbl1.datum_gereed AS 'GEREEDGEKOMEN OP', tbl1.factuur AS 'WEEKNUMMER' 
    FROM klusbonnen_deelnemers AS tbl1 
    INNER JOIN 
     (SELECT tbl2.bonnummer 
      FROM klusbonnen_deelnemers AS tbl2 
      WHERE tbl2.bonnummer NOT IN (
       SELECT tbl3.bonnummer 
        FROM klusbonnen_deelnemers AS tbl3 
        WHERE tbl3.gereed = 'NEE') 
    ) AS tbl4 ON tbl1.bonnummer = tbl4.bonnummer 
    INNER JOIN 
     (SELECT bonnummer, MAX(datum_gereed) AS 'MAXDATUM' 
      FROM klusbonnen_deelnemers 
      GROUP BY bonnummer 
    ) MAXFILTER ON tbl1.bonnummer = MAXFILTER.bonnummer 
     AND tbl1.datum_gereed = MAXFILTER.MAXDATUM 
    WHERE tbl1.datum_factuur BETWEEN NOW() - INTERVAL 2 MONTH AND NOW() 
    ORDER BY tbl1.bonnummer DESC 

Этот запрос работает, однако я думаю, что это может быть сделано намного более простым способом на вершине, что запрос работает только в моей. Редактор navicat. Вызов этого запроса на моем «живом» веб-сайте дает ошибку (подзапрос в предложении WHERE ...) (у меня все правильные логины, так как другие запросы DO работают).

Кто-нибудь, кто может помочь (упростить) этот запрос? Thx ...

+4

'не в' может быть опасно с допустимостью пустым. подумайте «не существует» – Drew

+0

Откуда вы знаете, сколько людей было связано с проектом ... чтобы вы знали, сколько одобрений нужно искать? У всех заказов есть одинаковое количество людей, одобряющих или все заказы по умолчанию имеют нет для всех пользователей, пока они, наконец, не одобрят? –

+0

Число людей, связанных с проектом, варьируется. Когда они назначаются в проект, новая строка добавляется для каждого пользователя, не выполняющего никаких действий. – user2960829

ответ

0

эта часть:

INNER JOIN (SELECT tbl2.bonnummer 
FROM klusbonnen_deelnemers AS tbl2 
WHERE tbl2.bonnummer NOT IN 
(SELECT tbl3.bonnummer 
FROM klusbonnen_deelnemers AS tbl3 
WHERE tbl3.gereed = 'NEE')) AS tbl4 
ON tbl1.bonnummer = tbl4.bonnummer 

кажется, бесполезно. попробуйте использовать gereed <> 'NEE' в «самый день» - WHERE

SELECT DISTINCT 
     kd.bonnummer AS 'KLUSBONNUMMER', 
     kd.adres  AS 'ADRES', 
     kd.binnen  AS 'BINNENGEKOMEN OP', 
     kd.klaar  AS 'ORIGINELE STREEFDATUM', 
     kd.datum_gereed AS 'GEREEDGEKOMEN OP', 
     kd.factuur  AS 'WEEKNUMMER' 
    FROM klusbonnen_deelnemers AS kd 
    INNER JOIN (
      SELECT bonnummer, MAX(datum_gereed) AS 'MAXDATUM' 
      FROM klusbonnen_deelnemers 
      GROUP BY bonnummer 
     ) AS MAXFILTER 
     ON (kd.bonnummer = MAXFILTER.bonnummer AND kd.datum_gereed = MAXFILTER.MAXDATUM) 
    WHERE 
     kd.gereed <> 'NEE' 
     kd.datum_factuur BETWEEN NOW() - INTERVAL 2 MONTH AND NOW() 
    ORDER BY 
     kd.bonnummer DESC 
+0

Thx man! Работает как шарм ... – user2960829

Смежные вопросы