Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从内部选择并按组获取行_Mysql_Sql - Fatal编程技术网

Mysql 从内部选择并按组获取行

Mysql 从内部选择并按组获取行,mysql,sql,Mysql,Sql,有500000-1000000行的学生表 |-----------------|------------------|------------------| | id | name | ref_id | |-----------------|------------------|------------------| | 1 | test |

有500000-1000000行的学生表

    |-----------------|------------------|------------------|
    |    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