2015-10-06 39 views
0

我正在使用存储过程来做这件事,显然以下不会是我的确切代码,而是一个高度修剪的版本,可以让您了解这个想法。请记住,我实际上在这个临时表上进行了很多筛选,因此向CREATE TABLE查询添加任何内容都会比其他任何事情更麻烦。遍历一个表并执行基于MySQL中的值的逻辑

BEGIN 
    CREATE TEMPORARY TABLE IF NOT EXISTS filtered_results AS (SELECT * FROM users); 
    # Numerous filters removing stuff from the table. 
END 

对于这个问题的目的,可以说,该表的结构是非常简单的,就像这样:

user_id INT(11) AUTO_INCREMENT PRIMARY 
name VARCHAR(30) NOT NULL 

现在,让我们说,我有一个问题表结构如下:

question_id INT(11) AUTO_INCREMENT PRIMARY 
user_id INT(11) 
text VARCHAR(40) 

现在让我们说我想遍历表并检查一些其他表来筛选没有至少4个问题的用户。因此,像这样:

for each row in filtered_results 
    if count(question_id) < 4 where user_id = row.user_id in questions 
     delete row 
    end if 
end loop 
+2

其中USER_ID在'从表中删除(具有USER_ID COUNT(*从问题分组选择USER_ID)<4)'? –

+0

@JorgeCampos - 我将如何去取得'filtered_results'表中每行的user_id而不进行迭代? – Hobbyist

+0

例如,我有500个用户有问题,但如果'filtered_results'表中只有3个用户,则没有理由选择并尝试从〜500个用户中删除。 – Hobbyist

回答

1

经过一番讨论后,你的最后的评论,我觉得我想出了一个解决方案比运行光标(在评论,因为我以前提到的)更优雅。

您需要根据您的to_be_deleted_tableLEFT JOIN和您的questions表,在结果中运行删除命令。我考虑到您的to_be_deleted_table上有user_id。

考虑这个示例:

create table filtered_results (
    user_id integer, 
    name varchar(10) 
); 
insert into filtered_results values 
(1, 'Bob'), (2, 'Sally'), (3, 'Cheer'), (4, 'Sid'), (5, 'Simon'), 
(6, 'Lua'), (7, 'Liv'), (8, 'Taylor'), (9, 'Jay'), (10, 'Mike'); 

create table questions (
    question_id integer, 
    user_id integer 
); 

insert into questions values 
(1, 1), (2, 1), (3, 1), (4, 1), (5, 1), 
(6, 2), (7, 2), 
(8, 3), (9, 3), (10, 3), (11, 3), 
(12, 4), (13, 4), (14, 4), (15, 4), 
(16, 5), (17, 5), (18, 5), (19, 5), 
(20, 6), (21, 6), (22, 6), (23, 6), 
(24, 7), (24, 7), (24, 7), (24, 7); 

该样品所有你说的话,那有4个(或更多的问题)的用户,有不到4个问题,用户的用户认为有疑问在所有。

删除,他们没有用户查询至少4个问题是:

delete 
    from filtered_results 
where user_id in 
    (select user_id 
     from (select f.user_id 
       from filtered_results f 
        LEFT JOIN questions q ON (f.user_id = q.user_id) 
       group by f.user_id 
       having count(*) < 4) a 
    ); 

你一定很奇怪为什么我有两个子查询,那是因为你需要欺骗编译器,您可以删除您正在进行选择的同一张表中的行,在此示例中为filtered_results

如果你想从基于在过滤表中的USER_ID另一个表删除只是做如下:

delete 
    from users 
where user_id in 
    (select f.user_id 
     from filtered_results f 
      LEFT JOIN questions q ON (f.user_id = q.user_id) 
     group by f.user_id 
     having count(*) < 4 
    ); 

请记住,如果是这样的话,你不需要创建filtered_results只是使用在第一种情况下,我将它创建为子查询的查询。

希望它有帮助。

如果你想看到它的工作,看看这个SQLFiddle

+0

不幸的是,无论出于何种原因,我最终都会使用方法的变更,并在所有过滤结束时使用条件执行SELECT语句,因此仍然应用过滤器。 – Hobbyist

相关问题