2013-03-07 38 views
3

這裏是我的表選擇只發生在string_id:SQL:一次每PAGE_ID

page_id | string_id |  content 
     1 | terms_en | etc text lorem ipsum 
     1 | terms_es | etc espanol lorem  
     2 | tabtext | stuff text lorem etc 
     3 | veh_name | etc stuff letters lala 
     4 | btn_txt | text for a button etc 
     4 | alert_txt | text for an alert etc lala 
     5 | page_cnt | lala pagecontent etc lala 

,我需要選擇所有page_id S的其中page_id只與它

在相關的一個string_id本質上,我試圖從該表中返回page_id s:235

我的SQL是這樣的:

SELECT page_id, string_id 
FROM lang_strings 
WHERE string_id != 'content' 
GROUP BY string_id, page_id 
HAVING count(string_id) < 2 AND count(page_id) < 2; 

回答

3

你必須使用count(distinct ...)

SELECT page_id, count(distinct string_id) 
FROM lang_strings 
WHERE string_id != 'content' 
GROUP BY page_id 
HAVING count(distinct string_id) = 1 

count()內使用distinct處理那裏是與相同string_id多行的情況下,當然可以算作只有一個的值(發生很多次)。

您還沒有指定您正在使用的數據庫,所以你可能會發現,你不必選擇count(distinct string_id)的查詢工作

+0

真棒。感謝您的幫助,這個作品完美 – 2013-03-07 04:50:37

+0

哈哈我忘了我把string_id!='內容在這篇文章中。我在你的查詢中看到它,我就像「WTF他怎麼知道這個」 – 2013-03-07 04:54:18

1

試試這個:

SELECT page_id 
    , max(string_id) as string_id 
FROM lang_strings 
WHERE string_id != 'content' 
GROUP BY page_id 
HAVING count(page_id) = 1 

如果您只需要page_id,則可以使用MAX函數刪除第二列。

+0

感謝您的幫助! – 2013-03-07 04:48:18

1

這應該爲你做。

SELECT page_id 
FROM (
    SELECT DISTINCT 
     page_id, 
     string_id 
    FROM lang_strings 
) t1 
GROUP BY t1.page_id 
HAVING COUNT(page_id) = 1 
+0

這是正確的。感謝您的幫助,總是有很多方法可以解決SQL中的問題! – 2013-03-07 04:50:07

+0

@Morgan肯定的事情。 COUNT(DISTINCT ...)絕對是更好的選擇。 – squillman 2013-03-07 14:42:57

1

與您的查詢的問題是,你是 PAGE_ID和string_id分組。

你可以僅僅通過PAGE_ID分組解決問題:

SELECT page_id, string_id 
FROM lang_strings 
WHERE string_id != 'content' 
GROUP BY page_id 
HAVING count(*) = 1 

這將返回page_id S作只有一行。所以,他們只有一個字符串ID。

如果你的意思是字符串ID發生在只有一個值,但可以有多個行,那麼我會推薦以下having條款:

where max(string_id) = min(string_id) 

您還可以使用:

where count(distinct string_id) = 1 

但是,最大/最小比較通常比count(distinct)執行得更好。

+0

我應該看到的。這是一天結束,你能說什麼?非常感謝你的幫助! – 2013-03-07 04:48:57

1

試試下面的代碼

SELECT page_id FROM lang_strings 
GROUP BY page_id 
HAVING count(string_id) = 1 

由於您沒有在一個問題中指定我沒有得到你爲什麼要使用 WHERE string_id != 'content'