2015-10-19 104 views
0

我想要做的是为每个用户统计同一列的特定实例。sql distinct + count

例如:
vagt_type可能具有的“timeloen” 10倍的值,其中usr = 1和“省” 2次该用户的值。我需要单独列中的计数,并且我使用DISTINCT来仅让每个usr得到一次。

下面是我到目前为止已经制定了,但是,才是最重要的vagt_type所有实例,由于某种原因没有受到cast从日期到日期:

$test = $wpdb->get_results("SELECT distinct m.usr, CONCAT(n1.meta_value, ' ', n2.meta_value) AS fl_name, count(m1.vagt_type) as timeloen 
FROM $main_table as m 
LEFT JOIN Lausten_usermeta n1 ON m.usr=n1.user_id and n1.meta_key = 'first_name' 
LEFT JOIN Lausten_usermeta n2 ON m.usr=n2.user_id and n2.meta_key = 'last_name' 
LEFT JOIN $main_table m1 ON m.usr=m1.usr and m1.vagt_type = 'timeloen' 
WHERE m.vagtDato BETWEEN CAST('$start' AS DATE) AND CAST('$end' AS DATE) 
", ARRAY_A); 

编辑: 例如我的表:

id | usr | vagtDato |  vagt_type 
13 | 1 | 2015-09-05 | kursus 
16 | 1 | 2015-09-01 | kursus 
11 | 1 | 2015-09-03 | trappetur 
10 | 1 | 2015-09-02 | provision 
9 | 1 | 2015-09-01 | timeloen  
15 | 1 | 2015-09-04 | sygedag 
17 | 1 | 2015-09-02 | timeloen  
18 | 29| 2015-09-18 | timeloen  
19 | 1 | 2015-10-01 | timeloen  

其他表存在的仅仅是join用户表及其在这种情况下并不重要,我只用它到CONCAT用户的全名。

预期结果:

usr | timeloen | provision | sygedag 
1 | 3  | 1   | 1 
29 | 1  | 0   | 0 

编辑: - 希望这可以帮助别人:) 什么结束了我的整体解决方案:

$test = $wpdb->get_results("SELECT a.usr, a.vagtDato, b.timeloen, c.provision, d.kursus, e.trappetur, f.sygedag 
FROM $main_table a 
LEFT JOIN (SELECT usr, count(vagt_type) as timeloen 
FROM $main_table WHERE vagt_type = 'timeloen' 
AND vagtDato between DATE('$start') AND DATE('$end') 
GROUP BY usr) b on b.usr=a.usr 

LEFT JOIN (SELECT usr, count(vagt_type) as provision 
FROM $main_table WHERE vagt_type = 'provision' 
AND vagtDato between DATE('$start') AND DATE('$end') 
GROUP BY usr) c on c.usr=a.usr 

LEFT JOIN (SELECT usr, count(vagt_type) as kursus 
FROM $main_table WHERE vagt_type = 'kursus' 
AND vagtDato between DATE('$start') AND DATE('$end') 
GROUP BY usr) d on d.usr=a.usr 

LEFT JOIN (SELECT usr, count(vagt_type) as trappetur 
FROM $main_table WHERE vagt_type = 'trappetur' 
AND vagtDato between DATE('$start') AND DATE('$end') 
GROUP BY usr) e on e.usr=a.usr 

LEFT JOIN (SELECT usr, count(vagt_type) as sygedag 
FROM $main_table WHERE vagt_type = 'sygedag' 
AND vagtDato between DATE('$start') AND DATE('$end') 
GROUP BY usr) f on f.usr=a.usr 

WHERE a.vagtDato between DATE('$start') AND DATE('$end') 
GROUP BY a.usr 
", ARRAY_A); 
+0

我们不禁要看看你的表格是如何相互关联的,以及一些样品数据和预期结果 –

+0

是否让人难以接受? –

+0

'CAST('$''AS DATE)'是完全错误的。这是你应该首先解决的问题。如果您将每个参数与正确的数据类型绑定,PDO或mysqli将为您执行此操作。 – Sebas

回答

0

我会相信你必须把东西如:

SELECT 
    usr 
    , (SELECT(count(*) FROM $TABLE where vagt_type = 'timeloen') AS timeloen 
    , (SELECT(count(*) FROM $TABLE where vagt_type = 'provision ') AS provision 
    , (SELECT(count(*) FROM $TABLE where vagt_type = 'sygedag') AS sygedag 
FROM ($main_table) 
    ($LEFTJOINS) 
GROUP BY usr --to get the distincts users 

SELECT 
    usr 
    , count(*) 
FROM ($main_table) 
    ($LEFTJOINS) 
GROUP BY 1, 2 --to get the distincts users 
+0

谢谢CAllen这个完美的作品! :) –

+0

或者至少它非常接近timeloen - 提供的查询计数,并且所有用户返回相同的结果... –

+0

欢迎您。任何时候。对不起,我做不了多少,因为我在我的手机上。但我仍然很高兴能够提供帮助 – CAllen