3

我有一个 PHP 逗号分隔的 id 字符串,例如1,2,3. 我有一个包含id列的 MySQL 表

表task_comments:

id
--
1
2

我想获取列表中不在表中的所有 id。在这里,我想得到3结果。

目前,我正在 PHP 中构建如下查询,它正在工作。

SELECT id FROM (
SELECT 1 id FROM DUAL
UNION ALL
SELECT 2 id FROM DUAL
UNION ALL
SELECT 3 id FROM DUAL
) a WHERE id NOT IN (SELECT id FROM task_comments);

我不认为这是做到这一点的好方法。我想知道是否有更好的方法来做到这一点,因为如果列表很大,union列表会增长。

谢谢

PS:如果需要,我也可以发布用于进行查询的 PHP 代码。
PPS:我想知道是否有更好的 MySQL Query。

4

4 回答 4

4

您在 PHP 中的字符串分隔值:

$my_ids = "1,2,3";

PHP中的SQL查询:

$query = "SELECT id FROM task_comments WHERE id IN ($my_ids)";

这将从数据库中返回 1 或 2 或 3 的 id 值。然后您可以简单地比较它。

于 2013-08-12T06:41:25.020 回答
3

你所做的已经是方法。除了(非常丑陋的)联合构造之外,没有其他方法可以创建推理集。您可以离开“from dual”并用普通联合替换联合 alls 以使其更短 - 尽管使用非常大的列表联合 all 可能是更高效的解决方案,因为它不会对重复删除进行排序。

SELECT id FROM (
SELECT 1 id
UNION
SELECT 2 id
UNION 
SELECT 3 id
) a WHERE id NOT IN (SELECT id FROM tasklist);

您可能还想看看临时表。这样,您可以以更自然的方式创建所需的集合,而不会触及涉及联合的大型 SQL 的限制。

CREATE TEMPORARY TABLE temp_table (id int);

INSERT INTO temp_table VALUES((1),(2),(3)); -- or just repeat for as many values as you might have from your app (batch insert?)

SELECT id FROM temp_table
WHERE id NOT IN (SELECT id FROM tasklist);

在此处查看有关临时表的更多信息。

于 2013-08-12T07:42:40.263 回答
2

您可以这样做:选择您的 ID:

SELECT id FROM task_comments WHERE id IN (1,2,3)

(这里 (1,2,3) 是根据您的数组数据构建的 - 例如,通过implode()函数)

然后,在一个循环中,将您的 id 提取到一个数组中,然后使用array_diff()查找缺少的值。

于 2013-08-12T06:27:16.273 回答
0

可能您应该首先保存所有与id's您的 id 字符串中存在的表不同的内容 -

SELECT DISTINCT id FROM task_comments WHERE id IN (1,2,3..)

然后比较两者。

于 2013-08-12T06:45:13.313 回答