我先用select 查询出好多信息,然后用delete删除掉这些信息,sql语句该怎么写呢?
delete from users where users_id in (select users_id from users where users_regdate > "2009-10-10");
这样写会报错。

解决方案 »

  1.   

    delete from users where users_regdate > '2009-10-10'
      

  2.   

    delete from users where users_regdate > "2009-10-10"; 
      

  3.   

    上面的查询只是举得一个例子啊,查询结果是多表联合查询出来的结果,然后再对users表进行删除操作
    查询是 select users_id from users where users_id not in (select users_id from info)
    然后把users 表中对应的users_id信息删除掉
      

  4.   

    一条查询语句查询出来删除是可行,不过你要考虑到你的执行效率,数据量大的时候估计页面就停止响应了。建议先select 出来存入数组,php批量删除!~
      

  5.   

    大概有2000条信息要删除,用php的批量删除$query = mysql_query("select users_id from users where users_id not in (select users_id from info)");
    if(mysql_num_rows($query) > 0){
      while(false != ($tt = mysql_fetch_array($query))){
        mysql_query("delete from users where users_id = ".$tt["users_id"]);
      }
    }如果这样执行会不会很占资源?
      

  6.   

    无论是什么样的需求,首先应该查一下手册6.4.6 DELETE 句法DELETE [LOW_PRIORITY] [QUICK] FROM table_name
           [WHERE where_definition]
           [ORDER BY ...]
           [LIMIT rows]orDELETE [LOW_PRIORITY] [QUICK] table_name[.*] [, table_name[.*] ...]
           FROM table-references
           [WHERE where_definition]orDELETE [LOW_PRIORITY] [QUICK]
           FROM table_name[.*] [, table_name[.*] ...]
           USING table-references
           [WHERE where_definition]DELETE 从 table_name 中删除 where_definition 中给定条件的记录行,并返回删除的记录数目。 如果你发出一个没有 WHERE 子句的 DELETE,所有的记录行将被删除。如果你以 AUTOCOMMIT 模式执行它,那么它类似于 TRUNCATE。查看章节 6.4.7 TRUNCATE 句法。在 MySQL 3.23 中,没有一个 WHERE 子句的 DELETE 将返回零作为受影响的记录数目。 当你删除所有记录行时,如果你真的希望知道多少条记录被删除,你可以使用一个这种形式的 DELETE 语句: mysql> DELETE FROM table_name WHERE 1>0;注意,这将比一个没有 WHERE 子句的 DELETE FROM table_name 语句慢,因为它一次只删除一行。 如果你指定关键词 LOW_PRIORITY,DELETE 的执行将被延迟,直到没有其它的客户端正在读取表。 如果你指定关键词 QUICK,那么在删除过程中存储引擎将不会归并索引叶,这可能会加速某些类型的删除操作。 在 MyISAM 表中,删除了的记录被放在一个链接表中维护,以后的 INSERT 操作将重新使用删除后的记录位置。为了回收闲置的空间,并减小文件尺寸,使用 OPTIMIZE TABLE 语句或 myisamchk 实用程序重新组织表。OPTIMIZE TABLE 使用比较容易,但是 myisamchk 更快点。查看章节 4.5.1 OPTIMIZE TABLE 句法 和章节 4.4.6.10 表优化。 第一个多表删除格式从 MySQL 4.0.0 开始被支持。第二个多表删除格式从 MySQL 4.0.2 开始被支持。 仅仅在 FROM 或 USING 子句 之前 列出的表中的匹配记录行被删除。效果就是,你要以从多个表中同时删除记录行,并且同样可以有其它的表用于检索。 在表名后的 .* 仅仅是为了兼容 Access: DELETE t1,t2 FROM t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.idorDELETE FROM t1,t2 USING t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id在上面的情况下,我们仅仅从 t1 和 t2 表中删除匹配的记录行。 如果一个 ORDER BY 子句被使用(从 MySQL 4.0.0 开始支持), 记录行将以指定的次序删除。这实际上只有连同 LIMIT 一起才有用。示例如下: DELETE FROM somelog
    WHERE user = 'jcole'
    ORDER BY timestamp
    LIMIT 1这将删除匹配 WHERE 子句的,并且最早被插入(通过 timestamp 来确定)的记录行。 DELETE 语句的LIMIT rows 选项是 MySQL 特有的,它告诉服务器在控制权被返回到客户端之前可被删除的最大记录行数目。这可以用来确保一个特定的 DELETE 命令不会占用太长的时间。你可以简单地重复使用 DELETE 命令,直到被影响的记录行数目小于 LIMIT 值。 从 MySQL 4.0 开始,在 DELETE 语句中可以指定多个表,用以从一个表中删除依赖于多表中的特殊情况的记录行。然而,在一个多表删除中,不能使用 ORDER BY 或 LIMIT。 
      

  7.   

    一条语句就可以搞定了DELETE u1.* FROM `users` u1 
    LEFT JOIN `info` u2 ON u1.users_id=u2.users_id 
    WHERE u2.users_id IS NULL
      

  8.   

    is null 不行的,我试过了,is null 查询不出来结果,因为表 info 中没有和对应的users_id信息。使用is null 查不出来信息,只能用子查询的方式查询结果。我对mysql 知道的很少,只是做php的时候要用到,只会一些简单的插入、删除、查询的语句使用方法。查手册看的也很迷茫。这条语句我急着用,希望大家帮忙写一下,谢谢了。如果先查询出来,然后再删除,用php一次执行一条删除语句会不会超级费资源?
      

  9.   

    你真的试过了吗?mysql> select * from user;
    +---------+-----------+
    | user_id | user_name |
    +---------+-----------+
    | 3       | omg       |
    | 2       | nor       |
    | 1       | lake      |
    | 4       | west      |
    +---------+-----------+
    4 rows in set (0.00 sec)mysql> select * from user_info;
    +---------+---------+
    | user_id | address |
    +---------+---------+
    | 2       | ccc     |
    | 4       | aaa     |
    +---------+---------+
    2 rows in set (0.00 sec)mysql> SELECT u1.*,u2.user_id FROM `user` u1 LEFT JOIN `user_info` u2 ON u1.user
    _id=u2.user_id;
    +---------+-----------+---------+
    | user_id | user_name | user_id |
    +---------+-----------+---------+
    | 3       | omg       | NULL    |
    | 2       | nor       | 2       |
    | 1       | lake      | NULL    |
    | 4       | west      | 4       |
    +---------+-----------+---------+
    4 rows in set (0.00 sec)mysql> delete u1.* FROM `user` u1 LEFT JOIN `user_info` u2 ON u1.user_id=u2.user
    _id where u2.user_id IS NULL;
    Query OK, 2 rows affected (0.00 sec)mysql> select * from user;
    +---------+-----------+
    | user_id | user_name |
    +---------+-----------+
    | 2       | nor       |
    | 4       | west      |
    +---------+-----------+
    2 rows in set (0.00 sec)
      

  10.   

    谢谢 foolbirdflyfirst 我终于知道 我的为什么不行了,把所有表的users_id都列出来就可以了,前面查询的时候没有全部列出来。也谢谢大家的热情回答。