tenho users
tabela:
CREATE TABLE `users` (
`uid` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`email` varchar(70) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`flname` varchar(60),
PRIMARY KEY (`uid`)
) ENGINE=InnoDB
E uma tabela de relacionamento:
CREATE TABLE `relationship` (
`rid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`from` mediumint(8) unsigned NOT NULL,
`to` mediumint(8) unsigned NOT NULL,
PRIMARY KEY (`rid`),
UNIQUE KEY `from_2` (`from`,`to`),
KEY `to` (`to`),
CONSTRAINT `relationship_ibfk_1` FOREIGN KEY (`from`) REFERENCES `users` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `relationship_ibfk_2` FOREIGN KEY (`to`) REFERENCES `users` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB
Quero buscar os usuários que não estão no círculo de um usuário específico (como o G+). Isso significa que o usuário ainda não adicionou essas pessoas ao seu círculo. Eu tentei a consulta abaixo, mas estava vazia:
SELECT uid FROM users WHERE flname LIKE'%john%' AND NOT EXISTS (Select `to` FROM relationship WHERE `from`=60)
A consulta abaixo retorna 3 registros:
SELECT uid,flname FROM users WHERE flname LIKE'%john%'
Agora os usuários em nome de john
quem foi adicionado por uid=60 não deveriam ser mostrados! O resultado desta consulta está vazio. Não consigo entender, o que estou fazendo de errado?
A subconsulta deve ser correlacionada:
(sem relação com o problema)
Quem disse que é uma boa ideia usar palavras reservadas como
to
efrom
como nomes de colunas ou tabelas, merece um pontapé.Você pode ter os mesmos resultados com um
LEFT JOIN / IS NULL
ou umaNOT IN
consulta: