* Colleen Dick
> This stumped them in PHPbuilder...
>
> I have a table lets call it moms
> each row in the moms table can have many kids,
> and some "kids" have >1 "mom". I have a kid table
> and I have a mxk map table to relate them.
>
> what I want to do is select all the moms and for each mom I want a
> random one of its kids to go with it.
>
>
>      SELECT moms.m_id,m_name,kids.k_id,k_name FROM
>      moms, mxk, kids WHERE
>                  moms.m_id = mxk.m_id
>      AND     mxk.k_id = kids.k_id
>      GROUP BY moms.m_id

Try this:

SELECT moms.m_id,m_name,
    MAX(CONCAT(RAND(),'|',kids.k_id,'|',k_name)) AS data
  FROM moms
  NATURAL JOIN mxk
  NATURAL JOIN kids
  GROUP BY moms.m_id, m_name

The MAX(CONCAT-thingy is known as the MAX-CONCAT trick, it is described
here:

<URL: http://www.mysql.com/doc/en/example-Maximum-column-group-row.html >

This is relatively heavy on the server, but this may not be significant if
the amount of data is small, i.e. a few thousand moms & kids should not be a
problem.

The natural join uses the column names to join, it seems this can be used in
your case, because the columns have the same name in the joined table. This
eliminates the need of a where clause in this case. The MAX-CONCAT trick
will also work with 'normal' joins, the way you had in your example.

You would need to split the data column in your application, in PHP it could
be something like this:

list($dummy, $k_id, $k_name) = explode("|",$myrow["data"]);

--
Roger


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

Reply via email to