Jessica,
Your first query, with inner joins, fails with the error message
Unknown column 'movies.id' in 'on clause
because the query inside parentheses in ...
...
FROM movies
INNER JOIN (director INNER JOIN director_movies
ON director_movies.director_id = director.id
AND director_movies.movie_id=movies.id)
...
references a table, movies, which is referenced only _outside_ the
parenthesis. Notice too that your construct
table1 INNER JOIN (joined_table_ref)
has not ON or USING clause, so it calls for a _cross_join_ between
table1 and joined_table_ref! I expect you didn't intend this, but rather
wanted ...
INNER JOIN (
director INNER JOIN director_movies ON director_movies.director_id =
director.id
) ON director_movies.movie_id=movies.id
...
When we fix that problem, and the same problem in the other join
clauses, we get ...
SELECT *
FROM movies
LEFT JOIN (director INNER JOIN director_movies
ON director_movies.director_id = director.id
) ON director_movies.movie_id=movies.id
LEFT JOIN (country INNER JOIN country_movies
ON country_movies.country_id = country.id
) ON country_movies.movie_id=movies.id
LEFT JOIN (producer INNER JOIN producer_movies
ON producer_movies.producer_id = producer.id
) ON producer_movies.movie_id=movies.id
WHERE movies.id = 123
which throws no syntax error. Is this the query you want?
Peter Brawley
http://www.artfulsoftware,com
-----
Jessica Yazbek wrote:
Wow, ok, I totally messed up my example.
I actually have 8 related tables (+8 relating tables), so I decided to
try to simplify and only show two - director and producer. However, I
left country in the select example.
So.. please also consider the following tables in my database:
country | CREATE TABLE `country` (
`id` int(11) NOT NULL auto_increment,
`country_of_origin` text NOT NULL,
PRIMARY KEY (`country_of_origin`(100)),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
| country_movies | CREATE TABLE `country_movies` (
`movie_id` int(11) NOT NULL default '0',
`country_id` int(11) NOT NULL default '0'
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Maybe I should send this to the list...grr!
Thanks for the help so far!
Jessica
On Feb 12, 2006, at 11:54 AM, Peter Brawley wrote:
table country_movies?
P.
Jessica Yazbek wrote:
By request, here are the create statements for my tables:
movies | CREATE TABLE `movies` (
`id` int(11) NOT NULL default '0',
`catalog_description` text,
`title` text,
`website_url` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
director | CREATE TABLE `director` (
`id` int(11) NOT NULL auto_increment,
`director_first_name` text NOT NULL,
`director_last_name` text NOT NULL,
PRIMARY KEY (`director_first_name`(100),`director_last_name`(100)),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
producer | CREATE TABLE `producer` (
`id` int(11) NOT NULL auto_increment,
`producer_first_name` text NOT NULL,
`producer_last_name` text NOT NULL,
PRIMARY KEY (`producer_first_name`(100),`producer_last_name`(100)),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
director_movies | CREATE TABLE `director_movies` (
`movie_id` int(11) NOT NULL default '0',
`director_id` int(11) NOT NULL default '0'
) ENGINE=InnoDB DEFAULT CHARSET=latin1
producer_movies | CREATE TABLE `producer_movies` (
`movie_id` int(11) NOT NULL default '0',
`producer_id` int(11) NOT NULL default '0'
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Again, I'm trying to select from movies,director, and producer,
using only one SELECT statement. Director and Producer are related
to movies via the tables director_movies and producer_movies.
Thanks again!
Jessica
On Feb 12, 2006, at 11:05 AM, Peter Brawley wrote:
Jessica,
To figure out what's causing your error, I for one would need the
CREATE statements.
PB
Jessica Yazbek wrote:
Hello,
I apologize if this is a common question; I have been working with
it and googling for days, and can't seem to find anyone who has
been trying to do the same thing that I am. Maybe I'm using the
wrong keywords. In any event, I am desperate for help. Here is my
problem:
I have a database with several tables related on a many-to-many
basis. Here is a simplified description:
TABLE: movies
+---------------------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+---------+------+-----+---------+-------+
| id | int(11) | | PRI | 0 | |
| catalog_description | text | YES | | NULL | |
| title | text | YES | | NULL | |
| website_url | text | YES | | NULL | |
+---------------------+---------+------+-----+---------+-------+
TABLE: director
+---------------------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default |
Extra |
+---------------------+---------+------+-----+---------+----------------+
| id | int(11) | | UNI | NULL |
auto_increment |
| director_first_name | text | | PRI |
| |
| director_last_name | text | | PRI |
| |
+---------------------+---------+------+-----+---------+----------------+
TABLE: producer
+---------------------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default |
Extra |
+---------------------+---------+------+-----+---------+----------------+
| id | int(11) | | UNI | NULL |
auto_increment |
| producer_first_name | text | | PRI |
| |
| producer_last_name | text | | PRI |
| |
+---------------------+---------+------+-----+---------+----------------+
TABLE: director_movies
+-------------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------+------+-----+---------+-------+
| movie_id | int(11) | | | 0 | |
| director_id | int(11) | | | 0 | |
+-------------+---------+------+-----+---------+-------+
TABLE: producer_movies
+-------------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------+------+-----+---------+-------+
| movie_id | int(11) | | | 0 | |
| producer_id | int(11) | | | 0 | |
+-------------+---------+------+-----+---------+-------+
There are actually several more related tables and fields, but I
think this is enough to give an idea of what I have. What I am
trying to do is SELECT all the information about a movie (all
fields from the movies table, plus director_first_name,
director_last_name, producer_first_name, producer_last_name) based
on the id from the movies table. The only problem is that there
may not be a producer and/or a director listed for a given movie,
in that case, I need those columns to be absent from the results
(ideally), or at least return as NULL. I was able to write a
select statement that works exactly as I want it in the cases
where there is both a director and a producer listed for the movie:
SELECT *
FROM movies
INNER JOIN (director INNER JOIN director_movies
ON director_movies.director_id = director.id
AND director_movies.movie_id=movies.id)
INNER JOIN (country INNER JOIN country_movies
ON country_movies.country_id = country.id
AND country_movies.movie_id=movies.id)
INNER JOIN (producer INNER JOIN producer_movies
ON producer_movies.producer_id = producer.id
AND producer_movies.movie_id=movies.id)
WHERE movies.id = 123
However, if there is no producer and/or director listed for the
movie id given, then the query returns 0 rows. I thought I might
need to change my JOINs to be LEFT JOINs insead of INNER, but when
I change the statement so that it reads as follows:
SELECT *
FROM movies
LEFT JOIN (director INNER JOIN director_movies
ON director_movies.director_id = director.id
AND director_movies.movie_id=movies.id)
LEFT JOIN (country INNER JOIN country_movies
ON country_movies.country_id = country.id
AND country_movies.movie_id=movies.id)
LEFT JOIN (producer INNER JOIN producer_movies
ON producer_movies.producer_id = producer.id
AND producer_movies.movie_id=movies.id)
WHERE movies.id = 123
I get a syntax error #1064 near my WHERE clause, and I can't
figure out what's causing it. I am new to understanding JOIN
clause syntax, so please excuse me if it's obvious.
I'm terribly sorry for such a long post. If anyone has any clue
how I can accomplish what I need to do, I will be so happy. As it
is, I've been on the verge of tears over this problem for way too
long!
Many thanks in advance,
Jessica Yazbek
--MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:
http://lists.mysql.com/[EMAIL PROTECTED]
--No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.1.375 / Virus Database: 267.15.5/256 - Release Date:
2/10/2006
--No virus found in this outgoing message.
Checked by AVG Free Edition.
Version: 7.1.375 / Virus Database: 267.15.6/257 - Release Date:
2/10/2006
--No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.1.375 / Virus Database: 267.15.6/257 - Release Date:
2/10/2006
--No virus found in this outgoing message.
Checked by AVG Free Edition.
Version: 7.1.375 / Virus Database: 267.15.6/257 - Release Date:
2/10/2006
--No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.1.375 / Virus Database: 267.15.6/257 - Release Date: 2/10/2006
--
No virus found in this outgoing message.
Checked by AVG Free Edition.
Version: 7.1.375 / Virus Database: 267.15.6/257 - Release Date: 2/10/2006
--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]