学生表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)
答案 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