SQL group by subselect

时间:2013-12-02 23:39:16

标签: mysql sql

我有以下查询:

select title_id, shared_task_id from tasks_task order by title_id

结果如下:

title_id    shared_task_id
1           99217
1           NULL
4           18873
4           18874
4           18875
4           NULL
4           NULL
4           NULL

我想找到所有shared_task_idtitle_id以上的title_id shared_task_id 1 100 2 100 3 105 3 NULL 4 110 5 NULL 6 120 6 120 6 120

这是一个例子。使用以下数据:

title_id       shared_task_id
1              100
2              100

查询将返回:

{{1}}

因为这是具有相同shared_task_id且具有不同标题的唯一条目。这里的正确查询是什么?

3 个答案:

答案 0 :(得分:2)

听起来像是一个自我加入的方式。

select distinct t1.title_id, t1.shared_task_id
from mytable t1 join mytable t2 on t1.shared_task_id = t2.shared_task_id 
and t1.title_id <> t2.title_id

答案 1 :(得分:1)

这应该这样做:

SELECT t1.* FROM tasks_task t1
JOIN (
  SELECT shared_task_id FROM tasks_task
  WHERE shared_task_id IS NOT NULL
  GROUP BY shared_task_id
  HAVING count(DISTINCT title_id) > 1
) t2 ON t1.shared_task_id = t2.shared_task_id

输出:

| TITLE_ID | SHARED_TASK_ID |
|----------|----------------|
|        1 |            100 |
|        2 |            100 |

小提琴here

答案 2 :(得分:0)

SELECT title_id, shared_task_id
FROM myTable
WHERE shared_task_id IN (
    SELECT shared_task_id
    FROM myTable 
    GROUP By shared_task_id HAVING COUNT(*) > 1
) 

更新:

SELECT title_id, shared_task_id
FROM myTable
WHERE shared_task_id IN (
    SELECT shared_task_id
    FROM ( SELECT DISTINCT title_id, shared_task_id FROM myTable ) A 
    GROUP By shared_task_id HAVING COUNT(*) > 1
)