我在数据库中有两个重复项,我想检查,所以我做了什么看到重复,我这样做:
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
Run Code Online (Sandbox Code Playgroud)
这样,我将获得所有具有related_field的行不止一次.此查询需要几毫秒才能执行.
现在,我想检查每个重复项,所以我想我可以在上面的查询中使用related_field选择some_table中的每一行,所以我喜欢这样:
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
)
Run Code Online (Sandbox Code Playgroud)
由于某种原因(这需要几分钟),结果显然是极慢的.究竟是什么让它变慢?related_field已编入索引.
最后我尝试从第一个查询创建一个视图"temp_view" (SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1),然后再这样做我的第二个查询:
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM temp_view
)
Run Code Online (Sandbox Code Playgroud)
这很好用.MySQL在几毫秒内完成此任务.
这里有任何SQL专家可以解释发生了什么吗?
我想写一个MySQL语句,如:
SELECT * FROM someTable WHERE someId IN (value1, value2, value3, ...)
Run Code Online (Sandbox Code Playgroud)
这里的诀窍是我提前不知道IN()中会有多少个值.
显然我知道我可以随时使用字符串操作生成查询,但是由于这将在循环中运行,我想知道我是否可以使用PDO PreparedStatement来完成.
就像是:
$query = $PDO->prepare('SELECT * FROM someTable WHERE someId IN (:idList)');
$query->bindValue(':idList', implode(',', $idArray));
Run Code Online (Sandbox Code Playgroud)
那可能吗?