2015-07-11 89 views
1

總數的信息,我有兩個表:選擇用戶與他們的意見

User : (id, username, created_at, updated_at) 

Comment : (comment_id, user_id, username, created_at, updated_at) 

注:是的,我明白評語表有成對的場,‘用戶名’。但是,表格已經按照這種方式設計,我沒有權限重新設計模式。


這是一個輸出格式,我想從表格中提取數據。

id | username | num_of_counts 

而且這是我和嘗試了兩種不同的SQL代碼(我已經簡化了代碼告訴你什麼是我想要做的...小的拼寫錯誤可能存在,但總體思路是。這裏)

-- Ver 1 
SELECT u.id, u.username, COUNT(c.id) 
FROM User u 
LEFT JOIN Comment c ON u.id = c.id 
GROUP BY u.id 

-- Ver 2 
SELECT u.id, u.username, c.cnt 
FROM User u 
LEFT JOIN (SELECT id, COUNT(*) AS cnt 
      FROM Comment 
      GROUP BY user_id) c 
     ON u.id = c.id 
GROUP BY u.id 

兩個代碼給了我同樣的問題:

「列‘用戶名​​’,是因爲它不是在選擇列表中無效包含3210在聚合函數或GROUP BY子句」

閱讀some articles把它之後,我明白了,有選擇‘用戶名’和‘ID’分組行之間的衝突。

我仍然在谷歌上搜索和閱讀similar cases,但仍然得到了同樣的問題(我不是善於SQL的東西...)

什麼是編寫SQL查詢來獲取輸出的最佳途徑這種格式?


id | username | num_of_comments  
1 | Tyler |  3  
2 | Jane |  5  
3 | Jack |  1 
+0

我建議你添加用戶名,cnt到group by子句,即group by u.id,u.username,c.cnt – ankur140290

+0

@GordonLinoff你說得對!!!!我打mysql而不是sql -server。對不起,大概是2-3點,當我問這個問題時,我太累了......修正了。 – Raccoon

+0

@Raccoon第一個版本是你想要的,但你必須通過c將u.username添加到組中因爲選擇中使用的所有未彙總的列必須出現在組中。 – jpw

回答

0

無論是已經解決了這個問題....:'(

SELECT 
*, 
(SELECT COUNT(id) FROM Comment WHERE id = id) AS Comments 
FROM User 
ORDER BY id DESC 

這項工作,各地已經解決了這個問題......它是我所實際編碼壽的簡化版本,我仍然欣賞你的回答。

3
SELECT u.id, u.username, COUNT(c.id) as theCount 
FROM User u 
JOIN Comment c ON u.id = c.id 
GROUP BY u.id,u.username 
2

德魯有正確的答案。但我想指出,你的第二個查詢也可以工作。它只是沒有在最外層需要group by

SELECT u.id, u.username, c.cnt 
FROM User u LEFT JOIN 
    (SELECT id, COUNT(*) AS cnt 
     FROM Comment 
     GROUP BY user_id 
    ) c 
    ON u.id = c.id; 

在某些情況下,這甚至可以有更好的性能 - 例如,如果username是一個好長好長的字符串。

相關問題