mysql:选择按一列分组的所有条目,该列在另一列中有一个公共值

mxg2im7a  于 2021-06-21  发布在  Mysql
关注(0)|答案(5)|浏览(403)

我有以下表格:

id | user_id | post_title | is published
1    9332      some title   0
2    2133      some title   1
3    9332      some title   0
4    2133      some title   1
5    4555      some title   0
6    4555      some title   1
7    3221      some title   0
8    3221      some title   0

我的目标是:寻找所有具有相同用户标识的条目,其中没有一个条目的“is published”=1。
因此,我必须得到id为1、3、7和8=>的条目,这些条目是迄今为止没有任何发布文章的用户的条目。
查询是什么样的?
扩展:
在这里可以找到小提琴:
http://sqlfiddle.com/#!9/b58fb3/1/0型
此外,我还创建了表2。我的目标是只显示表1中那些在表2中没有链接条目的用户条目。所以我的目标是,在执行查询之后,只剩下id为1和3的表1条目(只有用户9332个条目)。

h9a6wy2h

h9a6wy2h1#

试试这个:

SELECT 
    distinct user_id
FROM 
    table
WHERE user_id not in (SELECT DISTINCT user_id FROM table WHERE is_published = 1)
huus2vyu

huus2vyu2#

你可以用 not exists :

SELECT t.* 
FROM t 
WHERE NOT EXISTS (SELECT 1 
                  FROM t t2 
                  WHERE t2.user_id = t.user_id AND
                        t2.is_published = 1
                 );

例如,所有用户至少有两个条目。此查询将返回具有一个未发布条目的用户。目前尚不清楚这是否可取。否则,修改查询就相当简单了。

vyu0f0g1

vyu0f0g13#

例如。:
注意:不要在表/列标识符中使用空格。我已相应地修改了列名。

SELECT x.* 
  FROM table1 x 
  LEFT
  JOIN table1 y
    ON y.user_id = x.user_id
   AND y.is_published = 1
 WHERE x.is_published = 0
   AND y.id IS NULL;
2lpgd968

2lpgd9684#

使用嵌套查询:

SELECT DISTINCT `id`, 
                `user_id`, 
                `post_title`, 
                `is published`
FROM table1
WHERE user_id NOT IN (SELECT DISTINCT user_id FROM table1 WHERE `is published` = 1)
AND user_id  NOT IN (SELECT DISTINCT T1.user_id
                     FROM Table1 T1
                     INNER JOIN Table2 T2
                     ON T1.id=T2.table1_id)

或使用联接:

SELECT T1.*
FROM
Table1 T1
INNER JOIN
(
SELECT user_id,COUNT(*) AS CNT
FROM TABLE1 
GROUP BY user_id
) T2
ON T1.user_id=T2.user_id
INNER JOIN
(
SELECT user_id,COUNT(*) AS CNT FROM Table1
WHERE `is published` = 0
GROUP BY user_id
) T3
ON T2.user_id=T3.user_id
AND T2.CNT=T3.CNT
WHERE T1.user_id
NOT IN (
        SELECT T1.user_id
        FROM Table1 T1
        INNER JOIN Table2 T2
        ON T1.id=T2.table1_id
       )

输出

id  user_id post_title  is published
1   9332    some title  0
3   9332    some title  0

演示
http://sqlfiddle.com/#!2012年9月25日

j8ag8udp

j8ag8udp5#

简单的方法是使用 SUBQUERYGROUP BY 以及 HAVING 条款。我们可以返回重复的行,但是没有 is_published = 1 然后与外部查询连接,返回匹配id的记录

SELECT t.id,
    t.user_id,
    t.post_title,
    t.is_published 
FROM temp t
INNER JOIN (SELECT user_id
            FROM temp
            GROUP BY user_id HAVING SUM(is_published) = 0) u ON u.user_id = t.user_id
ORDER BY t.id

输出:

id  user_id post_title  is_published
1   9332    some title  0
3   9332    some title  0
7   3221    some title  0
8   3221    some title  0

相关问题