2017-05-08 59 views
0

我有以下模式:計數與內具體領域加入

create table myapp_task 
(
    title varchar(100) not null, 
    state varchar(11) not null, 
    estimate date not null, 
    my_id int not null auto_increment 
    primary key, 
    road_map_id int not null, 
    create_date date not null, 
    constraint myapp_task_road_map_id_5e114978_fk_myapp_roadmap_rd_id 
    foreign key (road_map_id) references myapp_roadmap (rd_id) 
); 
— auto-generated definition 
create table myapp_roadmap 
(
    rd_id int not null auto_increment 
    primary key, 
    name varchar(50) not null 
); 

我想拿到號,開始和CREATE_DATE一週的結束,所有的任務數,(的就緒任務數的狀態=「準備/ IN_PROGRESS')

這裏是我的查詢:

​​

其實,我有一個問題只與準備任務數。

+0

這真的是一個很大的要求,指定什麼是你的查詢問題? – Shadow

回答

3

我覺得你接近:

select week(create_date, 1) as week, 
    SUBDATE(create_date, WEEKDAY(create_date)) as beginofweek, 
    DATE(create_date + INTERVAL (6 - WEEKDAY(create_date)) DAY) as endofweek, 
    count(state) as number, 
    SUM(CASE WHEN state = 'ready' THEN 1 ELSE 0 END) as ready, 
    SUM(CASE WHEN state = 'in_progress' THEN 1 ELSE 0 END) as in_progress 
FROM myapp_task inner join myapp_roadmap 
    on myapp_task.road_map_id = myapp_roadmap.rd_id 
GROUP BY week, beginofweek, endofweek 

使用CASE語句,您可以加起來只states是單獨readyin_progress。此外,增加一個GROUP BY確保計數是在一週內。我認爲在這種情況下,MySQL可能會在沒有GROUP BY的情況下吐出正確的結果,但爲什麼要讓它猜到你想要的內容。另外,如果您升級到MySQL 5.7+,那麼默認情況下,沒有GROUP BY編寫的這樣的查詢將會出錯。


也擺脫了那個DISTINCT修飾符。由於@AaronDietz

+1

現在也可以擺脫那個'DISTINCT'修飾符。 –

+0

謝謝@AaronDietz我甚至沒有看到那裏鬼鬼祟祟的nogoodnick。 – JNevill

+0

我喜歡它,我總是使用'COUNT'。我從來沒有想過在SUM中使用'CASE'語句,但它很好用。 – ryansin

0

你應該查找使用aggregate functions

COUNT是返回的行數的功能,並獲得了國家總數兩個值和那些等於「準備好」 ,您需要使用不同的連接條件連接表格兩次。

然後未彙總的列需要包含在GROUP BY子句中。

select DISTINCT week(create_date, 1) as week, 
SUBDATE(create_date, WEEKDAY(create_date)) as beginofweek, 
DATE(create_date + INTERVAL (6 - WEEKDAY(create_date)) DAY) as endofweek, 
COUNT(r1.state) AS number, 
COUNT(r2.state) AS ready 
from myapp_roadmap inner join myapp_task r1 
on r1.road_map_id = myapp_roadmap.rd_id 
inner join myapp_task r2 
on r2.road_map_id = myapp_roadmap.rd_id and r2.state = 'ready' 
group by week, beginofweek, endofweek