我必须将这两个mysql查询合并为一个。我复制了一个解决方案并将其用于联接表。我正在查询一个有两列(标记为“to”和“from”)的联接表。“to”和“from”都持有同一表的ID号。我需要以这样的方式组合这些查询,以获得基于:[('from'+'to'')>3]的结果,其中'from''和'to''具有相同的值(即,它们引用相同的id)。
$query = "select * from nodes where nodeID in (
select to_ from joinTable group by to_ having count(*) > 3
)";
...
$query = "select * from nodes where nodeID in (
select from_ from joinTable group by from_ having count(*) > 3
)";
确认:我正在使用一个基于“e先生”之前帮助过我的解决方案的查询。
最佳答案
您可以尝试(请参阅最后一段有关“匹配要求”和“匹配要求”的重要注意事项):
SELECT X.to_, COUNT(*)
FROM joinTable X, joinTable Y
WHERE
X.to_ = Y.from_
GROUP BY X.to_
HAVING COUNT(*) > 2
或
SELECT X.to_, COUNT(*)
FROM joinTable X LEFT JOIN joinTable Y ON X.to_ = Y.from_
GROUP BY X.to_
HAVING COUNT(*) > 2
使用Mr E的测试数据:
CREATE TABLE `foo` (
`id` int(1) DEFAULT NULL,
`to_` varchar(5) DEFAULT NULL,
`from_` varchar(5) DEFAULT NULL
);
INSERT INTO `foo` VALUES (1,'A','B'),(2,'B','A'),(3,'B','C'),(4,'X','C'),(4,'X','B');
它将起到一半的作用,通过发布:
SELECT X.to_, Y.from_
FROM foo X LEFT JOIN foo Y ON X.to_ = Y.from_
这将产生:
mysql> SELECT X.to_, Y.from_ /*--, COUNT(*) */
-> FROM foo X LEFT JOIN foo Y ON X.to_ = Y.from_;
+------+-------+
| to_ | from_ |
+------+-------+
| A | A |
| B | B |
| B | B |
| B | B |
| B | B |
| X | NULL |
| X | NULL |
+------+-------+
7 rows in set (0.00 sec)
通过全速奔跑:
mysql> SELECT X.to_, COUNT(*)
-> FROM foo X LEFT JOIN foo Y ON X.to_ = Y.from_
-> GROUP BY X.to_
-> HAVING COUNT(*) > 2;
+------+----------+
| to_ | COUNT(*) |
+------+----------+
| B | 4 |
+------+----------+
基本上,将表与自身连接,然后从两个表的where to_u和from_u match(无论是否在同一行上)生成一个n:n匹配记录列表,然后使用一个列并将其值聚合为最终计数(*)。
而且,最重要的是,为什么我要将having count(*)上的数字从3降到2?n:n关系将发出n1*n2记录(其中n1是第一个表上匹配记录的计数,n2是第二个表上匹配记录的计数)。因此,如果下限是3,我们只能在这两个表上有3条以上的记录,方法是在其中一个表中有一条记录,然后在另一个表中有3条记录(按任何顺序),或者在其中一个表中有2条记录,然后在另一个表中有2条记录(从那里开始),否则在to和from字段上就没有匹配项,这就是我不确定OP是否只需要两个字段上都有值的记录,或者只需要一个count(*)就足够了。但是,如果是后者,除了将查询分开单独处理每个列之外,我看不到任何其他选项,因为有些人已经发布了消息,因为这是我们处理的一个单独的总和。如果碰到大桌子,速度会很慢。
关于mysql - SELECT * FROM表WHERE colA和colB至少有3个相同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6417022/