检查表

时间:2017-06-08 16:54:46

标签: mysql sql

我有一个用户ID列表,如下所示:

757392,733602,749955,744304,746852,753904,755117,636163,564931,740787,751450,743799,643918,
749903,571888,30207,705953,749120,749001,749192,749978,750840,544228,702121,746246,383667,
558790,585628,592771,745818,749375,241209,749235,746860,748318,748016,748951,747321,748684,
748225,565375,748673,747869,748522,748335,744775,672229,578056,713127,740234,632608,711135,
746528,362131,742223,746567,745224,332989,439837,745418,673582,269584,742606,745135,746950,
476134,740830,742949,276934

我有一个带有users字段的MySQL表id

如何使用查询检查users表格中存在的ID?

对我来说,这听起来像是一个简单的问题,但我在StackOverflow上找不到任何可以解决一组固定ID值的例子。

5 个答案:

答案 0 :(得分:2)

我不知道find_in_set()函数,并采用了更手工制作的方法。鉴于第一个答案,它并没有任何意义,但无论如何我都会发布它:

SELECT id
FROM (
    SELECT '757392' AS id UNION
    SELECT '733602' UNION
    SELECT '749955' UNION
    SELECT '744304' UNION
    SELECT '746852' UNION
    SELECT '753904' UNION
    SELECT '755117' UNION
    SELECT '636163' UNION
    SELECT '564931' UNION
    SELECT '740787' UNION
    SELECT '751450' UNION
    SELECT '743799' UNION
    SELECT '643918' UNION
    SELECT '749903' UNION
    SELECT '571888' UNION
    SELECT '30207'  UNION   
    SELECT '705953' UNION
    SELECT '749120' UNION
    SELECT '749001' UNION
    SELECT '749192' UNION
    SELECT '749978' UNION
    SELECT '750840' UNION
    SELECT '544228' UNION
    SELECT '702121' UNION
    SELECT '746246' UNION
    SELECT '383667' UNION
    SELECT '558790' UNION
    SELECT '585628' UNION
    SELECT '592771' UNION
    SELECT '745818' UNION
    SELECT '749375' UNION
    SELECT '241209' UNION
    SELECT '749235' UNION
    SELECT '746860' UNION
    SELECT '748318' UNION
    SELECT '748016' UNION
    SELECT '748951' UNION
    SELECT '747321' UNION
    SELECT '748684' UNION
    SELECT '748225' UNION
    SELECT '565375' UNION
    SELECT '748673' UNION
    SELECT '747869' UNION
    SELECT '748522' UNION
    SELECT '748335' UNION
    SELECT '744775' UNION
    SELECT '672229' UNION
    SELECT '578056' UNION
    SELECT '713127' UNION
    SELECT '740234' UNION
    SELECT '632608' UNION
    SELECT '711135' UNION
    SELECT '746528' UNION
    SELECT '362131' UNION
    SELECT '742223' UNION
    SELECT '746567' UNION
    SELECT '745224' UNION
    SELECT '332989' UNION
    SELECT '439837' UNION
    SELECT '745418' UNION
    SELECT '673582' UNION
    SELECT '269584' UNION
    SELECT '742606' UNION
    SELECT '745135' UNION
    SELECT '746950' UNION
    SELECT '476134' UNION
    SELECT '740830' UNION
    SELECT '742949' UNION
    SELECT '276934') AS id_list
WHERE id NOT IN (
    SELECT id
    FROM users);

答案 1 :(得分:1)

这是一个选项:

SELECT ids.id
  FROM ( SELECT @i
              , substring(@string, @start, @end-@start) id
            FROM <BigTable>
               , ( SELECT @string := <YourStringOfIds>
                        , @start:=0
                        , @end:=0
                        , @i:=0
                        , @len:=length(@string)
                        , @n:=@len-length(replace(@string,',',''))+1
                 ) t
            WHERE (@i := @i+1) <= @n
              AND (@start := @end+1)
              AND (@loc := locate(',',@string,@start))
              AND @end := if(@loc!=0,@loc,@len+1)
       ) ids
    LEFT JOIN <BigTable> u
      ON u.id = ids.id
  WHERE u.id is null

BigTable可以是任何行数&gt; =字符串中的ID数。

答案 2 :(得分:1)

您正在寻找带有否定的IN clause。即您可以将列表指定为IN子句的参数,如下所示:

SELECT * FROM users 
WHERE id NOT IN ( 757392,733602,749955,744304,746852,753904,755117,636163,564931,740787,751450,743799,643918,749903,571888,30207,705953,749120,749001,749192,749978,750840,544228,702121,746246,383667,558790,585628,592771,745818,749375,241209,749235,746860,748318,748016,748951,747321,748684,748225,565375,748673,747869,748522,748335,744775,672229,578056,713127,740234,632608,711135,746528,362131,742223,746567,745224,332989,439837,745418,673582,269584,742606,745135,746950,476134,740830,742949,276934 );

更新

我的坏 - 我没有正确地阅读这个问题。 因此,正确的方法是使用UNION s然后使用外部联接并按NULL进行过滤,如下所示:

SELECT WantedIds.id
FROM users
    RIGHT JOIN (
        SELECT x.id
        FROM (
            SELECT '757392' AS id UNION
            SELECT '733602' UNION
            SELECT '749955' UNION
            SELECT '744304' UNION
            SELECT '746852' UNION
            SELECT '753904' UNION
            SELECT '755117' UNION
            SELECT '636163' UNION
            SELECT '564931' UNION
            .
            .
            .
        ) x
    ) WantedIds
    ON WantedIds.id = users.id
WHERE users.id IS NULL

答案 3 :(得分:1)

创建临时表,然后填写

CREATE TABLE tmp (
  `id` INT NOT NULL,
  PRIMARY KEY (`id`));

INSERT INTO tmp (id) VALUES (1),(2),(3),(4),(5),(6)

然后进行查询

SELECT tmp.id
FROM tmp 
LEFT JOIN users u ON u.id = tmp.id
WHERE tmp.id IS NULL

最后放弃了表格

DROP TABLE tmp

答案 4 :(得分:0)

您可以使用MySQL的find_in_set() function来检查以逗号分隔的值列表中是否存在值:

select * from your_table
where find_in_set(field_name,'757392,733602,749955,744304,746852,753904,755117,636163,564931,740787,751450')=0