Hi Folks! I have a problem with a subquery using MySQL 4.1.12 (Fedora Core 4). I will include the SHOW CREATE TABLE for the two tables involved. Please, forgive me if I include this information in my original language (Spanish) but I wish to keep the field names as is to avoid any mistake.
I don't know if this problem is a MySQL subquery bug or I'm doing something wrong. Anyway, what I'm doing here is pretty straighforward. First, the table information: -- SHOW CREATE TABLE FOR TABLE "dominios_propios_completos" CREATE TABLE `dominios_propios_completos` ( `criterio` char(100) NOT NULL default '', `idDominio` int(10) unsigned NOT NULL default '0', `idSite` int(10) unsigned default NULL, `fechaCreacion` datetime default NULL, `idIdioma` tinyint(3) unsigned default NULL, `estado` tinyint(3) unsigned NOT NULL default '0', PRIMARY KEY (`criterio`,`idDominio`), KEY `idSite` (`idSite`), KEY `fechaCreacion` (`fechaCreacion`), CONSTRAINT `FK_dominios_propios_completos_1` FOREIGN KEY (`idSite`) REFERENCES `sites` (`id`) ON DELETE SET NULL ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED -- SHOW CREATE TABLE FOR TABLE "sites_criterios" CREATE TABLE `sites_criterios` ( `idSite` int(10) unsigned NOT NULL default '0', `criterio` varchar(100) NOT NULL default '', `criterio_pub` varchar(100) default NULL, `idIdioma` int(10) unsigned NOT NULL default '1', KEY `idSite` (`idSite`), KEY `idIdioma` (`idIdioma`), KEY `criterio` (`criterio`), KEY `criterio_pub` (`criterio_pub`), CONSTRAINT `sites_criterios_ibfk_1` FOREIGN KEY (`idSite`) REFERENCES `sites` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=latin1 OK, now for the problem. If you look at the above tables, they are somewhat related via "dominios_propios_completos.criterio" with "sites_criterios.criterio_pub". In fact, what I am doing is trying to make "dominios_propios_completos.criterio" a constraint for criterio_pub on table "sites_criterios". Now, look carefully: mysql> SELECT criterio, idSite -> FROM dominios_propios_completos -> WHERE criterio = "su-turno"; +----------+--------+ | criterio | idSite | +----------+--------+ | su-turno | 4305 | +----------+--------+ 1 row in set (0.00 sec) mysql> SELECT criterio_pub, idSite -> FROM sites_criterios -> WHERE criterio_pub = "su-turno"; Empty set (0.00 sec) In the above queries it's pretty clear the word "su-turno" exists in table "dominios-propios-completos" but NOT EXISTS in the table "sites_criterios" as a value of "criterio_pub". The problem is that the following subquery return no results... Why??? mysql> SELECT criterio, idSite -> FROM dominios_propios_completos -> WHERE criterio NOT IN ( -> SELECT criterio_pub -> FROM sites_criterios -> ); Empty set (0.05 sec) Why is this? It's obvious (at least to me) that this query must return "su-turno" at least. It interesting to note that if I further restrict the WHERE clauses, I get the correct output!! Take a look at this, for instance: mysql> SELECT criterio, idSite -> FROM dominios_propios_completos -> WHERE idSite = 4305 AND -> criterio NOT IN ( -> SELECT criterio_pub -> FROM sites_criterios -> WHERE idSite = 4305 -> ); +----------------------------------------+--------+ | criterio | idSite | +----------------------------------------+--------+ ... cut ... | su-turno | 4305 | +----------------------------------------+--------+ 245 rows in set (0.00 sec) I don't know why this last query is working and the former, more general one, isn't. I have tried different combinations, like using DISTINCT at the subquery, etc. I begun thinking this is a bug because I get different results if I modify the WHERE clause in the inner subquery, like this: mysql> SELECT criterio, idSite -> FROM dominios_propios_completos -> WHERE idSite = 4305 AND -> criterio NOT IN ( -> SELECT criterio_pub -> FROM sites_criterios -> ); Empty set (0.01 sec) Note that this query is THE SAME as the previous one, but with a wider result set inside the subquery. This makes no difference in my queries as we confirmed at least the word "su-turno" does not exists. Thanks for your patience. If you think I'm doing something wrong please reply. Cheers, Jose Miguel. -- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]