I think you understand. Here is how I would re-write the query to use the
new table:
$query = "SELECT
l.CatalogNumber,
l.PDFLink,
l.PDFName,
l.MP3Name,
l.Title,
p.PublisherName,
c.ComposerLname,
a.ArrangerLname,
l.Price,
l.Description,
l.DiscountID,
l.DiscountType,
l.DiscountAmount,
o.Alias,
l.Description
FROM listings l
INNER JOIN publishers p
ON l.PublisherID=p.PublisherID
INNER JOIN composers c
ON l.ComposerID=c.ComposerID
INNER JOIN arrangers a
ON l.ArrangerID=a.ArrangerID
INNER JOIN listings_categories lc
ON l.ListingID = lc.ListingID
INNER JOIN categories o
ON lc.CategoryID = o.CategoryID
WHERE o.Name='".$Category."'
ORDER BY ".$OrderBy;
(That's just the style I prefer as I can more easily spot which "match-up"
conditions belong to which sets of tables. That way I am less likely to
leave one out and accidentally create a cartesian product of any two
tables. The comma separated style you use is absolutely, perfectly valid.)
Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine
"Erich Beyrent" <[EMAIL PROTECTED]> wrote on 08/04/2004 12:39:55
PM:
> I think I understand. So instead of my queries being centered around
> the listings table, they will be centered around this new table?
>
> Currently, I pull the records for each category like so:
>
> $query = "select
> l.CatalogNumber,
> l.PDFLink,
> l.PDFName,
> l.MP3Name,
> l.Title,
> p.PublisherName,
> c.ComposerLname,
> a.ArrangerLname,
> l.Price,
> l.Description,
> l.DiscountID,
> l.DiscountType,
> l.DiscountAmount,
> o.Alias,
> l.Description
> from
> listings l,
> publishers p,
> composers c,
> arrangers a,
> categories o
> where
> l.CategoryID=o.CategoryID and
> o.Name='".$Category."' and
> l.PublisherID=p.PublisherID and
> l.ComposerID=c.ComposerID and
> l.ArrangerID=a.ArrangerID
> order by ".$OrderBy;
>
>
> To follow your example, I would add these other fields to the
> listings_projects table you defined below, and restructure the query
> around that?
>
> Thanks for your insight!
>
> -Erich-
>
> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
> Sent: Wednesday, August 04, 2004 11:51 AM
> To: [EMAIL PROTECTED]
> Cc: [EMAIL PROTECTED]
> Subject: Re: Design Question
>
> As posted, your data structure supports two one-to-many relationships,
> not
> the one-to-one relationships as you described. You can have multiple
> Listings per Category and multiple Categories per Group. What it sounds
>
> like you have been asked to do is to support a many-to-many
> relationship.
> You need to support both multiple Listings per Category and multiple
> Categories per Listing.
> As you have it now:
> Groups (1..*) Categories (1..*) Listings
>
> As you need it to be:
> Groups (1..*) Categories (*..*) Listings
>
>
> To create a (*..*) relationship between two tables, you need a third
> table. Each entry in this table represents one Listing-Category
> association (relationship).
>
> CREATE TABLE listings_projects (
> ListingID bigint not null
> , CategoryID int
> , ... any additional fields as needed ...
> , PRIMARY KEY (ListingID, CategoryID)
> )
>
> The primary key ensures that at each Listing/Category combination
> appears
> only once (no duplicate assignments). I showed you where additional
> fields
> can fit into the relation table because sometimes there are facts about
> relationships that do not fit into either of the tables they relate A
> recent example in this list was a relation table between chemical
> compounds and the various plants in which those compounds could be
> found.
> A fact that belongs to the *relationship* could be the concentration of
> that chemical in that plant. That concentration value would not belong
> to
> the plants table nor would it belong to the compounds table but does
> belong to the relationship of plant to compound. Make sense? I have
> personally used additional fields like those to indicate "deletion".
> That
> way "old" values are no longer available for new relationships (in my
> applications) and my queries won't break as I didn't actually get rid of
>
> any information. My "historical" reports still function as the "old"
> names
> are still in the system, even if you can't use the the old names for any
>
> current purposes.
>
> Yours,
> Shawn Green
> Database Administrator
> Unimin Corporation - Spruce Pine
>
>
>
>
> "Erich Beyrent" <[EMAIL PROTECTED]> wrote on 08/04/2004 10:35:33
>
> AM:
>
> > Hi all,
> >
> > I need some advice on a project I have. Basically, I have some
> tables:
> >
> > CREATE TABLE listings (
> > ListingID bigint(20) unsigned NOT NULL auto_increment,
> > CatalogNumber varchar(12) NOT NULL default '',
> > PDFLink varchar(100) default NULL,
> > PDFName varchar(80) default NULL,
> > Title varchar(100) NOT NULL default '',
> > ComposerID int(11) default NULL,
> > ArrangerID int(11) default NULL,
> > PublisherID int(11) default NULL,
> > Price double(16,2) NOT NULL default '0.00',
> > DiscountID int(11) default NULL,
> > Description text,
> > NewTitles tinyint(1) default NULL,
> > CategoryID int(11) NOT NULL default '0',
> > PRIMARY KEY (ListingID)
> > ) TYPE=MyISAM;
> >
> > CREATE TABLE categories (
> > CategoryID int(11) NOT NULL auto_increment,
> > Name varchar(50) NOT NULL default '',
> > Alias varchar(60) default NULL,
> > DiscountID int(11) default NULL,
> > Description text,
> > GroupID int(11) NOT NULL default '0',
> > PRIMARY KEY (CategoryID)
> > ) TYPE=MyISAM;
> >
> > CREATE TABLE groups (
> > GroupID int(11) NOT NULL auto_increment,
> > Name varchar(50) default NULL,
> > DiscountID int(11) default NULL,
> > PRIMARY KEY (GroupID)
> > ) TYPE=MyISAM;
> >
> >
> > Currently, there is a one-to-one relationship between listings and
> > categories, and listings and groups. Now, the customer is requesting
> > that a listing be included in several categories. I am not quite sure
> > how to do this.
> >
> > My thought was to add a new field to the listings table that would
> > contain a comma-separated list of CategoryIDs, but something doesn't
> > feel right about this solution.
> >
> > What would be a good approach to this problem?
> >
> > -Erich-
> >
> >
> >
> > --
> > MySQL General Mailing List
> > For list archives: http://lists.mysql.com/mysql
> > To unsubscribe:
> http://lists.mysql.com/[EMAIL PROTECTED]
> >
>
>
>
> --
> MySQL General Mailing List
> For list archives: http://lists.mysql.com/mysql
> To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]
>