[Dbix-class] Finding missing rows -- JOIN with multiple conditions

Bill Moseley moseley at hank.org
Mon Jun 3 17:06:05 GMT 2013


On Mon, Jun 3, 2013 at 5:04 AM, Peter Rabbitson <rabbit+dbic at rabbit.us>wrot=
e:

> On Sat, Jun 01, 2013 at 04:22:17PM -0700, Bill Moseley wrote:
> > After stumbling around for a while I realize I need some help with
> building
> > a query with DBIC.
>
> That was a rather long email. It isn't immediately clear *which* part
> you are still having a problem with. Can you rephrase the question...?
>

Did I see that more complex join conditions are possible now with DBIC w/o
a virtual view?


This is one of those "find where joined row do not exist" problems that is
often solved with a correlated sub-query.  But, I think I can solve (and
much faster) with just a join.   But I need to have extra join condition
(in *bold* below).


This is essentially the query I'm after where I join with the "track" table
but only if the track.songwriter is associated with the musician (because
there's other musicians that might have track rows).

SELECT
         musician_band.musician, musician.band, album.id as album

    FROM
         musician_band
         LEFT JOIN band ON  musician.band =3D band.id
         LEFT JOIN album ON album.band =3D band.id
         LEFT JOIN track ON track.album =3D album.id* AND  track.songwriter=
 =3D
musician_band.musician*
         LEFT JOIN track_detail ON track_detail.id =3D track.id

    WHERE
         band in ( @bands )
         AND (
             track.id IS NULL  -- NULL thus means there's no track written
by the musician on that album.
             OR track_detail.is_on_album IS FALSE
         )


So, with the normal join it would be something like this:


schema->resultset( 'MusicianBand' )->search(
    {
        'me.band' =3D> { -in =3D> \@band_ids },
        -or =3D> [
            'tracks.id' =3D> undef,
            'track_detail.is_on_album' =3D> 0,
        ],
    },
    {
        select =3D> [qw/ me.musician me.band albums.id /],
        as     =3D> [qw/ musician band album / ],
        join   =3D> {
            bands =3D> {
                albums =3D> {
                    tracks =3D> 'track_detail',
                },
            },
        },
    },
);



-- =

Bill Moseley
moseley at hank.org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.scsys.co.uk/pipermail/dbix-class/attachments/20130603/e3d=
7e03f/attachment.htm


More information about the DBIx-Class mailing list