Mysql 从内部选择并按组获取行
有500000-1000000行的学生表Mysql 从内部选择并按组获取行,mysql,sql,Mysql,Sql,有500000-1000000行的学生表 |-----------------|------------------|------------------| | id | name | ref_id | |-----------------|------------------|------------------| | 1 | test |
|-----------------|------------------|------------------|
| id | name | ref_id |
|-----------------|------------------|------------------|
| 1 | test | NULL |
|-----------------|------------------|------------------|
| 2 | test | 1 |
|-----------------|------------------|------------------|
| 3 | test3 | 1 |
|-----------------|------------------|------------------|
| 4 | test4 | NULL |
如何查询以下情况:
返回该行中的id不作为表的任何ref_id存在的行,并且仅当名称显示超过1时才返回
如果表中的行id=2未显示为任何参考id,则另一行中的行2未显示为参考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)
首先获取ref_id中不存在的id列表
然后获取重复多次的id列表
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
您确定ID为1的行是要返回的行吗?您声明您的条件是返回ID不在ref_ID中的行,但该ID在ref_ID中出现两次。该行确实满足您的第二个条件-名称出现两次,但第一个条件失败。@sloarthrasher。抱歉,修复了行不符合任何条件的问题。该名称只出现一次,并且没有任何行具有匹配的ref\u id。@Sloachrisher。为什么?id为2的行。->该id不会出现在任何ref_id中,因此名称测试显示的值大于1,因此它符合我的条件,因为id=2 ref_id为1,这是存在的。但是,你说在任何参考资料中都不存在。这是矛盾的。我会试试看。如果我有另一个叫name 2的coulmn,我需要两人一组进行检查。同时命名1和2。它是如何改变查询的,?我的意思是name=test,name2=guest,所以它在其他方面需要相同rows@Guz在n2.name=n1.name应该改为在n2.name=n1.name和n2.=n1.谢谢,查询正在工作,但我得到了重复的列名'id'@Guz重复的名称id是什么意思?@Guz我不知道您的应用程序设计和要求。而且,我已经给了你们种族隔离的解决方案。现在,您需要根据您的需求决定如何、执行什么以及何时执行。祝你一切顺利!!
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