2015-10-19 6 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); 

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); 
+0

Мы не можем помочь, не видя, как ваши таблицы относятся друг к другу, а некоторые данные образца и ожидаемые результаты –

+0

- это что? –

+0

'CAST ('$ end' 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

Спасибо, что это работает отлично! :) –

+0

Или, по крайней мере, его очень близкое количество запросов для timeloen - предоставление и такое возвращение одинакового результата для всех пользователей ... –

+0

Ваш прием ... В любое время. Извините, я не мог много сделать, потому что я был на своем телефоне. Но все равно рад, что могу помочь – CAllen