簡體   English   中英

MySQL BY之前的COUNT條記錄

[英]MySQL COUNT records before GROUP BY

我正在對兩個表進行簡單的查詢,並且試圖計算如果不對它們進行分組,則具有相同ID的記錄數。 這些是表格:

TABLE職位

id-類型-user_id-field_id

1-繪畫-53-12

2-閱讀-53-12

3-寫作-53-12

TABLE活動

id-is_test-user_id-field_id

7-是-53-12

8-否-53-12

通過此查詢,我從表jobs (繪畫)中獲得了我想要的單條記錄,因為我在jobs.id列上使用了GROUP BY子句。 如果我不使用GROUP BY,我將獲得2條記錄,因為對於同一user_idfield_id有2個匹配的活動。

SELECT `jobs`.*,`activities`.`is_test` 
FROM `jobs` 
LEFT JOIN `activities` ON `activities`.`user_id`=`jobs`.`user_id` 
WHERE `jobs`.`field_id`=12 AND `activities`.`field_id`=12 AND `jobs`.`type`='painting' AND `jobs`.`user_id`=53 
GROUP BY `jobs`.`id` 
ORDER BY `jobs`.`id` DESC;

我想做的是獲取另一個包含表activities實際匹配記錄數的列。 基本上我想在具有相同user_idfield_id activities獲得2作為記錄數。

我試圖選擇像這樣的新列:

SELECT `jobs`.*,`activities`.`is_test`, COUNT(DISTINCT `jobs`.`id`) AS `tot_act` 

但這顯然為新列tot_act返回1而不是2。 讓它計算現場activities.is_test .is_test也不起作用。

試圖避免進行子選擇

請不要關注activities.is_test列,我不在乎是否將其設置為Yes或No,我只想計算是否存在與Yes匹配的記錄,而對於No則有一個記錄,因此總共有2條記錄我不分組。 2是我嘗試作為新列檢索的值

任何想法將不勝感激!

您的第一個查詢沒有任何意義。 “分組依據”僅在輸出列(選擇子句)中與集合函數結合使用。

activity.field_id上的where過濾器(昂貴地)將左聯接轉換為內部聯接。

我還懷疑您的架構未規范化。

獲取另一個包含表活動中實際匹配記錄數的列

SELECT `jobs`.id, jobs.type, jobs.user_id, 
  Jobs.field_id,`activities`.`is_test`, 
  SUM(IF(activities.id IS NULL, 0,1)) 
FROM `jobs` 
 LEFT JOIN `activities` 
 ON `activities`.`user_id`=`jobs`.`user_id` 
 AND activities.field_id=12
WHERE `jobs`.`field_id`=12 
 AND `jobs`.`type`='painting' 
 AND `jobs`.`user_id`=53 
GROUP BY `jobs`.id, jobs.type, jobs.user_id, 
  Jobs.field_id,`activities`.`is_test`
ORDER BY `jobs`.`id` DESC;

COUNT()對於遇到的每個NON NULL值都增加1。

在您的情況下,您需要活動表而不是作業表中的行數。

SELECT
      jobs.id
    , jobs.type
    , jobs.user_id
    , Jobs.field_id
    , COUNT(activities.id) activity_count
FROM jobs
      LEFT JOIN activities ON jobs.user_id = activities.user_id
                  AND activities.field_id = 12
WHERE jobs.field_id = 12
      AND jobs.type = 'painting'
      AND jobs.user_id = 53
GROUP BY
      jobs.id
    , jobs.type
    , jobs.user_id
    , Jobs.field_id
ORDER BY
      jobs.id DESC;

從查詢的樣本數據中得出以下結果:

| id |     type | user_id | field_id | activity_count |
|----|----------|---------|----------|----------------|
|  1 | painting |      53 |       12 |              2 |

但是請注意,如果在select和grouping子句中包含activity.is_test,則計數不會為2。

看到這個sqlfiddle

SELECT
  `jobs`.id,
  `jobs`.type,
  `jobs`.user_id,
  `jobs`.field_id,
  count(1) as activities_count,
  max(`activities`.is_test) as is_test
FROM
  `jobs`
LEFT OUTER JOIN
  `activities` ON
  `activities`.user_id = `jobs`.user_id
  AND `activities`.field_id = `jobs`.field_id
WHERE
  `jobs`.field_id = 12
  AND `jobs`.type = 'painting'
  AND `jobs`.user_id = 53
GROUP BY
  `jobs`.id,
  `jobs`.type,
  `jobs`.user_id,
  `jobs`.field_id

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM