2014-01-15 33 views
1

我試圖向右報告按性別來獲得在我的系統的所有種族的崩潰。集團通過查詢導致不正確的數據出現

我有這個疑問,我認爲是工作,但所有的日期是在查詢中,他們是不是個別表中的一樣。我認爲group_by導致了一個問題,但我不是100%,我不知道如何恰當地糾正這個查詢。

SELECT f1.field_name, count(*) AS total 
FROM application_fields f1 
JOIN application_fields_values v1 ON v1.application_field_id = f1.id 
JOIN application_fields_values v2 ON v1.applicant_id = v2.applicant_id 
JOIN application_fields f2 ON v2.application_field_id = f2.id 
JOIN templates t ON f1.template_id = t.id 
JOIN template_fields tf ON f1.template_field_id = tf.id 
WHERE v1.field_value = 1 
AND v2.field_value = 1 
AND f2.field_name = 'Male' 
AND f1.field_name != 'Male' 
-- AND f1.created_at BETWEEN '2014-01-01' AND '2014-12-31' 
AND tf.id IN (9, 10, 11, 12, 13, 14, 15) 
GROUP BY f1.field_name 
ORDER BY f1.id; 

此輸出:

FIELD_NAME   CREATED_AT    CREATED_AT   TOTAL 
Hispanic or Latino. 2013-06-20 02:35:56  2013-06-20 02:35:56 6 
Caucasion.   2013-06-20 02:35:56  2013-06-20 02:35:56 26 
African American. 2013-06-20 02:35:56  2013-06-20 02:35:56 25 
Native Hawaiian. 2013-06-20 02:35:56  2013-06-20 02:35:56 1 
Asian.    2013-06-20 02:35:56  2013-06-20 02:35:56 2 
American Indian. 2013-06-20 02:35:56  2013-06-20 02:35:56 2 
Two or more races . 2013-06-20 02:35:56  2013-06-20 02:35:56 1 

我希望能夠按日期過濾此(你可以在我註釋掉線看),但因爲所有的日期都是一樣的,這不是正常工作在這個查詢中,當他們絕對不在表中時。

+4

即使MySQL允許你不匹配by子句的選擇和組,我還沒有看到它是一個好主意。 –

+0

我只在查詢中添加'created_at'日期進行調試。如果我從select語句中取出'created_at'字段,我仍然沒有獲取數據。 – Catfish

回答

0

看來,我一直在尋找在錯誤的表中的條款之間created_at列。

AND f1.created_at BETWEEN '2014-01-01' AND '2014-12-31' 

應該已經

AND v1.created_at BETWEEN '2014-01-01' AND '2014-12-31' 
2

在選擇列表中的每個非集合字段應該被包含在你GROUP BY

SELECT f1.field_name, f1.created_at, f2.created_at, count(*) AS total 
FROM application_fields f1 
JOIN application_fields_values v1 ON v1.application_field_id = f1.id 
JOIN application_fields_values v2 ON v1.applicant_id = v2.applicant_id 
JOIN application_fields f2 ON v2.application_field_id = f2.id 
JOIN templates t ON f1.template_id = t.id 
JOIN template_fields tf ON f1.template_field_id = tf.id 
WHERE v1.field_value = 1 
    AND v2.field_value = 1 
    AND f2.field_name = 'Male' 
    AND f1.field_name != 'Male' 
    -- AND f1.created_at BETWEEN '2014-01-01' AND '2014-12-31' 
    AND tf.id IN (9, 10, 11, 12, 13, 14, 15) 
GROUP BY f1.field_name, f1.created_at, f2.created_at 
ORDER BY f1.id; 

MySQL不要求所有的字段包含在GROUP BY,但沒有他們返回的值是任意的。

如果對於領域多個值還沒有包含在GROUP BY然後,而不是將它們包含在你的GROUP BY你可能需要對它們使用聚合函數,即:

SELECT f1.field_name, MAX(f1.created_at), MAX(f2.created_at), count(*) AS total 
FROM application_fields f1 
JOIN application_fields_values v1 ON v1.application_field_id = f1.id 
JOIN application_fields_values v2 ON v1.applicant_id = v2.applicant_id 
JOIN application_fields f2 ON v2.application_field_id = f2.id 
JOIN templates t ON f1.template_id = t.id 
JOIN template_fields tf ON f1.template_field_id = tf.id 
WHERE v1.field_value = 1 
    AND v2.field_value = 1 
    AND f2.field_name = 'Male' 
    AND f1.field_name != 'Male' 
    -- AND f1.created_at BETWEEN '2014-01-01' AND '2014-12-31' 
    AND tf.id IN (9, 10, 11, 12, 13, 14, 15) 
GROUP BY f1.field_name 
ORDER BY f1.id; 
+0

看到我對這個問題的評論。 – Catfish

+0

從沒有分開查詢從'GROUP BY'問題伸出,不知道還有什麼可以在不知道數據會好一點來完成。 –

1

你」再通過一列只(f1.field_name),但你包括select子句中的多個列分組。這樣的分組在MySQL中是允許的,但是真的不鼓勵,因爲它可能會導致這樣的結果。

的問題是,你可能有相同的分組字段f1.field_name不同的日期(f1.created_atf2.created_at),所以它不可能只選擇一個獨特的日期爲每個組的值。在這種情況下,邏輯上你不應該包括select子句中這些字段(沒有任何聚合函數)。

您還可以添加f1.created_atf2.created_atgroup by條款,但是這會給你的結果通過這可能不是你所需要的日期打破。