我想要做的是为每个用户统计同一列的特定实例。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);
我们不禁要看看你的表格是如何相互关联的,以及一些样品数据和预期结果 –
是否让人难以接受? –
'CAST('$''AS DATE)'是完全错误的。这是你应该首先解决的问题。如果您将每个参数与正确的数据类型绑定,PDO或mysqli将为您执行此操作。 – Sebas