Dúvida SQL - como passar uma lista para um WHERE em uma query?

8 respostas
gtludwig

Pessoal,

Eu consigo selecionar os dados assim:

E gostaria de remover os dados que retornam dessa query. Tentei sem sucesso:

Eu imagino que seja possível fazer o que quero, certo?

8 Respostas

R

Na sua instrução de DELETE, no lugar do igual coloque IN

Ficaria:

gtludwig

Eu tentei isso que você me sugeriu, mas retornou o seguinte erro:

maior_abandonado

antes de tudo, qual banco de dados você esta usando?

a sugestão do renato está correta, mas isso depende de se na sua tabela groups tem uma coluna chamada id (e de preferencia que ela seja unica como uma primary key por exemplo).

caso não tenha essa coluna, use alguma coluna unica no lugar de id no exemplo dele.

gtludwig

O banco é o MySQL e as tabelas da query são definidas assim:

CREATE TABLE IF NOT EXISTS `groups` ( `id` int(11) NOT NULL AUTO_INCREMENT, `course_id` int(11) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, `max_people` int(11) DEFAULT NULL, `min_people` int(11) DEFAULT NULL, `price` decimal(10,2) DEFAULT NULL, `created_at` datetime DEFAULT NULL, `updated_at` datetime DEFAULT NULL, `questionary_id` int(11) DEFAULT NULL, `required_evaluation` tinyint(1) DEFAULT '0', `close_registration` tinyint(1) DEFAULT NULL, `publish` tinyint(1) DEFAULT '1', `old_id` int(11) DEFAULT NULL, `no_course_days` tinyint(1) DEFAULT NULL, `training_company_id` int(11) DEFAULT NULL, `test_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1516 ;

CREATE TABLE IF NOT EXISTS `courses` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) DEFAULT NULL, `publication_date` datetime DEFAULT NULL, `archive_date` datetime DEFAULT NULL, `description` text, `duration` varchar(255) DEFAULT NULL, `created_at` datetime DEFAULT NULL, `updated_at` datetime DEFAULT NULL, `client_id` int(11) DEFAULT NULL, `project_number` varchar(255) DEFAULT NULL, `e_learning_url` varchar(255) DEFAULT NULL, `test_id` int(11) DEFAULT NULL, `waiting_list` tinyint(1) DEFAULT NULL, `waiting_list_time` int(11) DEFAULT NULL, `summary` varchar(255) DEFAULT NULL, `materials_available` tinyint(1) DEFAULT '1', `waiting_list_always` tinyint(1) DEFAULT NULL, `no_groups_or_all_groups_are_full` tinyint(1) DEFAULT NULL, `old_id` int(11) DEFAULT NULL, `waiting_list_state` varchar(255) DEFAULT 'never', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=742 ;

maior_abandonado

bom… segunda a pagina do próprio banco ( http://dev.mysql.com/doc/refman/4.1/pt/any-in-some-subqueries.html ) a sintaxe seria essa mesma… se não esta funcionando ai deve ser bug (ou alguma coisa que não vimos que está errado.

FacaNaCaveira

o SQL abaixo que esta dentro do IN esta retornando a lista de gr.id???

SELECT gr.id FROM groups gr, courses co WHERE gr.course_id = co.id AND co.client_id = 5

Abração :!:
Max

gtludwig

sim, retorna, sim!

claudiom

procurando o erro no google, vi em vários lugares que você não pode fazer uma subquery com a mesma tabela que está atualizando…

a documentação do mysql que cita isso está aqui

neste post aqui tem um workaround para esta limitação.

Criado 12 de julho de 2010
Ultima resposta 15 de jul. de 2010
Respostas 8
Participantes 5