3

这是我的桌子:

 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_idspage_idstring_id

从本质上讲,我试图从这个表中返回page_ids: 23和。5

我的 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;
4

5 回答 5

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

distinct在句柄中使用具有相同count()的多行的情况,这当然会算作只有一个值(发生多次)。 string_id

您尚未指定您正在使用的数据库,因此您可能会发现您不必选择 count(distinct string_id)查询即可工作

于 2013-03-07T01:48:45.330 回答
1

试试下面的代码

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

由于您没有具体说明问题,我不明白您使用的原因 WHERE string_id != 'content'

于 2013-03-07T08:54:35.573 回答
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).

于 2013-03-07T02:04:34.727 回答
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 函数删除第二列。

于 2013-03-07T01:49:03.410 回答
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
于 2013-03-07T01:52:44.300 回答