从数组中选择不在表中的id

时间:2013-08-12 06:19:24

标签: mysql

我有一个PHP昏迷分隔的id字符串,如1,2,3。我有一个MySQL表,其中有id

表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查询。

4 个答案:

答案 0 :(得分:3)

PHP中的字符串分隔值:

$my_ids = "1,2,3";

PHP中的SQL查询:

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

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

答案 1 :(得分:3)

你所做的就是做到这一点。除了(非常丑陋的)联合构造之外,没有其他方法来创建集合来推理。你可以离开“from dual”并用简单的联合替换union alls以缩短它 - 虽然有一个非常大的列表联合所有可能是更高性能的解决方案,因为它不排序重复删除。

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

详细了解临时表here.

答案 2 :(得分:2)

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

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

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

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

答案 3 :(得分:0)

您可能应首先保存表格中存在的所有不同的id's -

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

然后比较两者。