MySQL Subquery bug or am I doing something wrong?

2005-09-01 Thread Jose Miguel Pérez
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]



Re: MySQL Subquery bug or am I doing something wrong?

2005-09-01 Thread Pooly
Hi,


 mysql SELECT criterio, idSite
 - FROM dominios_propios_completos
 - WHERE criterio NOT IN (
 - SELECT criterio_pub
 - FROM sites_criterios
 - );
 Empty set (0.05 sec)
 

Do you have NULL values in sites_criterios.criterio_pub ?

-- 
Pooly
Webzine Rock : http://www.w-fenec.org/

--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:http://lists.mysql.com/[EMAIL PROTECTED]



Re: MySQL Subquery bug or am I doing something wrong?

2005-09-01 Thread Jose Miguel Pérez
Hi Pooly!

 mysql SELECT criterio, idSite
 - FROM dominios_propios_completos
 - WHERE criterio NOT IN (
 - SELECT criterio_pub
 - FROM sites_criterios
 - );
 Empty set (0.05 sec)

 Do you have NULL values in sites_criterios.criterio_pub ?

Yes Pooly, certainly it had. Thanks for your comment!! This was the
problem, again thank you very much.

I am now very ashamed as this is a newbie mistake. I was fooled because
I was pretty sure I had no NULL values, but you know... I'm not the only one
inserting values into the table. :-)

Cheers,
Jose Miguel.


-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:http://lists.mysql.com/[EMAIL PROTECTED]