2012-06-06 103 views
0

一些背景。我正在使用Rails 3进行拼车应用程序。我使用fullcalendar作为jQuery日历库。它也不起作用很好,当一天中有很多事件。所以,我想要做的是有两个“事件源”。在一个中,我想返回所有事件,按日期和类别分组,计数小于某个值。 对于其他,我想返回所有记录,其中有一个计数为,比这个值多导轨3,不同的计数倍数有条件

道歉,如果这是不明确,一些样本数据可能使之更加明显

基本记录结构:

| id | date | category_id | 
| 1  | 1-Aug |  1  | 
| 2  | 1-Aug |  1  | 
| 3  | 1-Aug |  1  | 
| 4  | 1-Aug |  2  | 
| 5  | 1-Aug |  2  | 
| 6  | 1-Aug |  3  | 

假设3是一个神奇的计数次数(3或更高版本进行分组)我想一个选择返回

| id | date | category_id | count | 
| 1  | 1-Aug |  1  |  3 | 

(我并不真正关心的是,ID可以使用GROUP_CONCAT组合(与MySQL)),在我的使用情况下,它并不重要 - 我想知道的是,在8月1日第1类有3项

第二选择应该返回一切

| id | date | category_id | count | 
| 4  | 1-Aug |  2  |  2 | 
| 5  | 1-Aug |  2  |  2 | 
| 6  | 1-Aug |  3  |  1 | 

我并不真的需要计数返回,但问题是,有每一个结果个体行不具有计数> = 3

目前我的SQL是这样的:

SELECT `pools`.* 
FROM  `pools` 
INNER JOIN `fields` ON `fields`.`id` = `pools`.`field_id` 
INNER JOIN `regions` ON `regions`.`id` = `fields`.`region_id` 
INNER JOIN `countries` ON `countries`.`id` = `regions`.`country_id` 
WHERE `regions`.`country_id` = 1 
    AND `pools`.`confirmed` = 1 
    AND (leaving_date >= '2012-04-30 00:00:00') 
    AND (leaving_date <= '2012-06-04 00:00:00') 
GROUP BY field_id, leaving_date 
HAVING count(*) >= 3 
ORDER BY leaving_date 

我可以遍历通过量h数组返回 - 但如果可能的话,我宁愿在SQL方面做。还想在最少的数据库行程中做到这一点..一般指针将非常感激!

+0

一般的指针将创造两个作用域返回的数据集,你想和使用它们:) – DVG

回答

0

也许这是开始有用:

CREATE TEMPORARY TABLE grouped_rows AS 
    SELECT `pools`.* 
    FROM       `pools` 
    INNER JOIN `fields`    ON `fields`.`id`    = `pools`.`field_id` 
    INNER JOIN `regions`   ON `regions`.`id`   = `fields`.`region_id` 
    INNER JOIN `countries` ON `countries`.`id` = `regions`.`country_id` 
    WHERE `regions`.`country_id` = 1 
      AND `pools`.`confirmed`    = 1 
      AND (leaving_date >= '2012-04-30 00:00:00') 
      AND (leaving_date <= '2012-06-04 00:00:00') 
    GROUP BY field_id, leaving_date; 
    HAVING   count(*) >= 3; 


SELECT `pools`.* 
FROM       `pools` 
INNER JOIN `fields`     ON `fields`.`id`    = `pools`.`field_id` 
INNER JOIN `regions`   ON `regions`.`id`   = `fields`.`region_id` 
INNER JOIN `countries` ON `countries`.`id` = `regions`.`country_id` 
LEFT JOIN grouped_rows ON grouped_rows.field_id  = pools.field_id 
         AND grouped_rows.leaving_date = pools.leaving_date 
WHERE `regions`.`country_id` = 1 
  AND `pools`.`confirmed`    = 1 
  AND (leaving_date >= '2012-04-30 00:00:00') 
  AND (leaving_date <= '2012-06-04 00:00:00') 
    AND grouped_rows.some_not_null_field IS NULL 

UNION ALL 

SELECT * FROM grouped_rows 

ORDER BY leaving_date; 


DROP TEMPORARY TABLE grouped_rows; 

我不知道你是否能发出三个报表和一个往返得到UNION的结果。 也许你可以将temptable的select嵌入UNION的两半,但是它可能会给MySQL服务器(或不是)提供更多的工作。

更新:

我发现,您可以使用一个查询的解决方案。这仅仅是基本的骨架结构,但我想你可以根据它转换查询:

http://sqlfiddle.com/#!2/f67e3/18

SELECT 
    IF(grouped.gcat, NULL, item.id) AS out_id 
,item.cat AS out_cat 
,COALESCE(grouped.gcount, 1) out_count 

FROM item 

LEFT JOIN 
(
    SELECT count(*) AS gcount, cat AS gcat 
    FROM  item 
    GROUP BY gcat 
    HAVING count(*) >= 3 
) AS grouped 
    ON item.cat = grouped.gcat 

GROUP BY out_id 
+0

正确 - 所以没有办法在SQL调用中做到这一点?当然,在Rails中不太好?该死的!将其标记为正确(因此延迟!) –

+0

嗨,我用单选方式更新了我的答案。 – biziclop