I disagree with your LEFT JOIN/RIGHT JOIN results.
SELECT
activenodes.name,lrsrc.lid,activelayers.rsrcc,lrsrc.rsrc,nrsrc.rsrc
FROM activelayers
LEFT JOIN lrsrc ON lrsrc.id=activelayers.id AND
lrsrc.lid=activelayers.lid
RIGHT JOIN nrsrc ON lrsrc.rsrc=nrsrc.rsrc
RIGHT JOIN activenodes ON nrsrc.id=activenodes.id
ORDER BY activelayers.lid DESC;
Since you RIGHT JOINed "nrsrc" and "activenodes" to your query, neither
your 1st nor your 5th columns should contain any null values. So, the
columns that could contain null values are the 2nd, 3rd, and 4th (as both
"activelayers" and "lrsrc" are optional tables
However, only your 2nd and 4th columns contain nulls. So, where are the
optional (non-matching) rows for column 3? Where are those null values?
There should be nulls there for everywhere you have a null in columns 2
and 4, right?
...OR...
Are the tables "activelayers", "nrsrc", and "activenodes" participating in
a Cartesian product and only "lrsrc" is actually optional?
Which method of looking at this query is correct? Can you be certain that
the same style query will respond with the same decisions about which
tables are optional and which ones aren't (because of the mix of LEFT and
RIGHT joins in the same query)? The only way to avoid this kind of
"order-of-operations" dilemma is to use parentheses to group (nest) your
joins so that they evaluate in the correct order. However, last time I
checked, that is still on the TODO list to fix.
http://dev.mysql.com/doc/mysql/en/TODO_sometime.html (see third from last)
So to get back to the original issue.
To recap: from http://lists.mysql.com/mysql/174702
<snip>
Conceptually, here's what I'm trying to do: I've got a set of tasks to
execute
("frames"). The frames which are ready to execute are in "wait" mode.
These
frames are associated with "layers" (in the table "layers"), and these
layers
have 0 or more "layer resource requirements" (in the table "lrsrc"). I
also
have a table of compute nodes ("nodes"). Each of these nodes has 0 or
more
"node resources" (in the table "nrsrc"). If a layer requires "linux" and
"perl" resources, frames in that layer will only run on compute nodes
which
have "linux" and "perl" resources.
<snip>
What was the question are you trying to answer? I know it was something
about matching layers and nodes but I am not perfectly clear on what
results you wanted.
I really do want to help and I don't want to argue over what I think is a
bug (or an under-developed section) in the program. You may have received
the results you wanted this time but I am not confident that this query is
correct for the question you are asking nor am I confident that it will
continue to return correct results in the future.
Thanks for your patience,
Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine
Laszlo Thoth <[EMAIL PROTECTED]> wrote on 10/30/2004 04:21:15 AM:
>
> On Oct 29, 2004, at 6:26 AM, [EMAIL PROTECTED] wrote:
>
> > I think it may be because of your mixed left and right joins. There
> > are several bugs listed that show that the optimizer mishandles
> > certain combinations of left and right joins.
> >
> > SELECT
> >
> >
activelayers.id,activelayers.lid,activelayers.rsrcc,COUNT(lrsrc.rsrc=nr
> > src.rsrc)
> > as matchcount,activenodes.name,activenodes.rsrcc
> > FROM activelayers
> > LEFT JOIN lrsrc ON lrsrc.id=activelayers.id AND
> > lrsrc.lid=activelayers.lid
> > INNER JOIN nrsrc ON lrsrc.rsrc=nrsrc.rsrc
> > INNER JOIN activenodes ON nrsrc.id=activenodes.id
> > GROUP BY activelayers.id,activelayers.lid,activenodes.id
> > HAVING matchcount=activelayers.rsrcc
> > ORDER BY activelayers.lid DESC;
>
> This actually didn't produce the same result. I'm doing a RIGHT JOIN
> rather than a LEFT or INNER JOIN to catch node resources (nrsrc) which
> do not match layer resources (lrsrc), or nodes with no layer resources
> at all. This example makes the difference a little clearer:
>
> SELECT
> activenodes.name,lrsrc.lid,activelayers.rsrcc,lrsrc.rsrc,nrsrc.rsrc
> FROM activelayers
> LEFT JOIN lrsrc ON lrsrc.id=activelayers.id AND
> lrsrc.lid=activelayers.lid
> RIGHT JOIN nrsrc ON lrsrc.rsrc=nrsrc.rsrc
> RIGHT JOIN activenodes ON nrsrc.id=activenodes.id
> ORDER BY activelayers.lid DESC;
>
> +-------+------+-------+------+------+
> | name | lid | rsrcc | rsrc | rsrc |
> +-------+------+-------+------+------+
> | node1 | NULL | 1 | NULL | 1 |
> | node2 | NULL | 1 | NULL | 2 |
> | node3 | NULL | 1 | NULL | 1 |
> | node3 | NULL | 1 | NULL | 2 |
> | node0 | NULL | 1 | NULL | NULL |
> | node1 | 4 | 2 | 1 | 1 |
> | node2 | 4 | 2 | 2 | 2 |
> | node3 | 4 | 2 | 1 | 1 |
> | node3 | 4 | 2 | 2 | 2 |
> | node0 | NULL | 2 | NULL | NULL |
> | node1 | 3 | 2 | 1 | 1 |
> | node2 | 3 | 2 | 2 | 2 |
> | node3 | 3 | 2 | 1 | 1 |
> | node3 | 3 | 2 | 2 | 2 |
> | node0 | NULL | 2 | NULL | NULL |
> | node1 | NULL | 1 | NULL | 1 |
> | node2 | 2 | 1 | 2 | 2 |
> | node3 | NULL | 1 | NULL | 1 |
> | node3 | 2 | 1 | 2 | 2 |
> | node0 | NULL | 1 | NULL | NULL |
> | node1 | 1 | 1 | 1 | 1 |
> | node2 | NULL | 1 | NULL | 2 |
> | node3 | 1 | 1 | 1 | 1 |
> | node3 | NULL | 1 | NULL | 2 |
> | node0 | NULL | 1 | NULL | NULL |
> | node1 | NULL | 0 | NULL | 1 |
> | node2 | NULL | 0 | NULL | 2 |
> | node3 | NULL | 0 | NULL | 1 |
> | node3 | NULL | 0 | NULL | 2 |
> | node0 | NULL | 0 | NULL | NULL |
> +-------+------+-------+------+------+
>
> SELECT
> activenodes.name,lrsrc.lid,activelayers.rsrcc,lrsrc.rsrc,nrsrc.rsrc
> FROM activelayers
> LEFT JOIN lrsrc ON lrsrc.id=activelayers.id AND
> lrsrc.lid=activelayers.lid
> INNER JOIN nrsrc ON lrsrc.rsrc=nrsrc.rsrc
> INNER JOIN activenodes ON nrsrc.id=activenodes.id
> ORDER BY activelayers.lid DESC;
>
> +-------+------+-------+------+------+
> | name | lid | rsrcc | rsrc | rsrc |
> +-------+------+-------+------+------+
> | node1 | 4 | 2 | 1 | 1 |
> | node3 | 4 | 2 | 1 | 1 |
> | node2 | 4 | 2 | 2 | 2 |
> | node3 | 4 | 2 | 2 | 2 |
> | node1 | 3 | 2 | 1 | 1 |
> | node3 | 3 | 2 | 1 | 1 |
> | node2 | 3 | 2 | 2 | 2 |
> | node3 | 3 | 2 | 2 | 2 |
> | node2 | 2 | 1 | 2 | 2 |
> | node3 | 2 | 1 | 2 | 2 |
> | node1 | 1 | 1 | 1 | 1 |
> | node3 | 1 | 1 | 1 | 1 |
> +-------+------+-------+------+------+
>
>
> --
> MySQL General Mailing List
> For list archives: http://lists.mysql.com/mysql
> To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]
>