Что я хочу сделать, так это подсчет конкретных экземпляров одного и того же столбца для каждого пользователя.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);
Edit: пример моего стола:
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
EDIT: - надеюсь, что это помогает кто-то еще :) Что закончилось тем, что мое общее решение:
$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 ('$ end' AS DATE)' совершенно неверно. Это то, что вы должны исправить первым. PDO или mysqli сделают это для вас, если вы привяжете каждый параметр к соответствующему типу данных. – Sebas