2014-01-14 1 views
0

У меня есть следующие 3 таблицы: unit, stage, stats.SQL-запрос для нескольких таблиц и операций в MySQL

 unit      stage 
+----+--------+ +----+-------+---------------------+ 
| id | status | | id |unit_id|  date   | 
+----+--------+ +----+-------+---------------------+ 
| 1 |  2 | | 1 |  2 | 2013-11-22 00:00:00 | 
| 2 |  3 | | 2 |  2 | 2013-11-26 12:00:00 | 
| 3 |  3 | | 3 |  3 | 2013-10-11 00:00:00 | 
| 4 |  0 | | 4 |  1 | 2013-12-29 00:00:00 | 
+----+--------+ +----+-------+---------------------+ 

        stats 
+----+----------+---------------------+-------+ 
| id | stage_id |  date   | clicks| 
+----+----------+---------------------+-------+ 
| 1 |  1 | 2013-11-22 00:00:00 | 10 | 
| 2 |  1 | 2013-11-23 00:00:00 | 20 | 
| 3 |  1 | 2013-11-24 00:00:00 | 25 | 
| 4 |  2 | 2013-11-26 00:00:00 | 15 | 
| 5 |  2 | 2013-11-27 12:00:00 | 21 | 
| 6 |  3 | 2013-12-29 00:00:00 |  8 | 
+----+----------+---------------------+-------+ 

Мне нужен запрос, который будет производить следующий ответ:

+---------+---------------------+-----------------------+ 
| unit.id | stage.min.date | sum(stats.max.clicks) | 
+---------+---------------------+-----------------------+ 
|  2 | 2013-11-22 00:00:00 |     46 | 
|  3 | 2013-12-29 00:00:00 |      8 | 
+---------+---------------------+-----------------------+ 

следующими правилами:

1) unit.id - показать только блоки с unit.status=3

2) stage.min.date - минимальный stage.date для соответствующих unit_id

3) sum(stats.max.clicks) - сумма stats.clicks с максимальными значениями для каждого stage_id, связанного с соответствующими unit_id. В моем примере 46 = 25 (stage_id=1) + 21 (stage_id=2)

Проблема заключается в min.date и сумме кликов - я понятия не имею, как получить ее в одном запросе. Определенно, это не проблема для этого, используя php-код и несколько запросов.

Schema in SQL Fiddle

Спасибо заранее.

+3

Так вы хотите, чтобы написать свой код, не так ли? –

+0

если вы попробовали любой запрос или код, пожалуйста, сообщите об этом. это поможет решить проблему –

+0

Проблема заключается в том, что я не могу скомпилировать это в одном запросе без использования php-кодирования. –

ответ

1

Я просто спрашиваю себя, почему я это делаю? Ваш пример resonse имеет ошибку, и не совпадает с вашей скрипки ... но:

SELECT 
    cc.unit_id, MIN(cc.date) as stage_min_date , SUM(dd.clicks) as stats_max_clicks 
FROM 
    stage cc 
LEFT JOIN (
    SELECT 
    bb.stage_id, bb.clicks 
    FROM 
    stats bb LEFT JOIN (
     SELECT id, stage_id, MAX(date) AS max_date 
     FROM stats 
     GROUP BY stage_id 
    ) aa 
    ON 
    aa.max_date = bb.date 
    WHERE 
    aa.max_date IS NOT NULL 
) dd 
ON cc.id = dd.stage_id 
LEFT JOIN unit ee 
ON ee.id = cc.unit_id 
WHERE ee.status = 3 
GROUP BY cc.unit_id 

...

+0

К сожалению, этот код не решает мою проблему. Вот [SQLfiddle] (http://sqlfiddle.com/#!2/e6457/2/0) –

+1

Я изменил некоторые вещи. Просьба дважды или трижды проверить свои образцы и скрипки, это не помогает со всеми этими ошибками. – Floyd

+0

Большое спасибо. Он работает сейчас! –

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