从内部选择和按组

时间:2018-01-27 19:00:43

标签: mysql sql

学生表500,000-1,000,000行

    |-----------------|------------------|------------------|
    |    id           |     name         |    ref_id        |
    |-----------------|------------------|------------------|
    |         1       |        test      |    NULL          |
    |-----------------|------------------|------------------|       
    |          2      |        test      |    1             |
    |-----------------|------------------|------------------|         
    |           3     |         test3    |    1             |
    |-----------------|------------------|------------------|
    |           4     |         test4    |    NULL          |

如何查询以下案例: 返回该行中的id不存在的行作为表的任何ref_id,并且仅当名称出现超过1时

如果在表格中,行id = 2不会出现在另一行中的任何ref_id(" 2"不会显示为ref_id我应该选择他,而第二个条件是取得他的名字并检查id名称是否唯一)

所以在上面的例子中,要返回的行是id 2 的行。因为它不会显示为ref_if,而且名称也不会超过1。

第3行不好,因为名称test3只出现1

我试过了:

SELECT st.id FROM students at
WHERE at.id NOT IN (SELECT stt.ref_id FROM students stt)

1 个答案:

答案 0 :(得分:1)

首先获取id

中不存在的ref_id列表
SELECT st.id FROM students at
WHERE NOT EXIST (SELECT * FROM students stt where stt.ref_id=at.id)

然后获取id的列表name多次重复

SELECT id, name FROM student n1
inner join student n2 on n2.name=n1.name where n1.id <> n2.id

现在,将这两个查询加在一起

SELECT t1.id FROM
(SELECT st.id FROM students at
WHERE NOT EXIST (SELECT * FROM students stt where stt.ref_id=at.id)) t1
INNER JOIN
(SELECT id, name FROM student n1
inner join student n2 on n2.name=n1.name where n1.id <> n2.id
) t2 on t1.id=t2.id