mySQL join question
The following line is giving an error message.
$query = 'SELECT * FROM products AS p LEFT JOIN categories AS c USING ON c.id = p.category_id WHERE c.name = "Galleri1"
AND p.status = "active"' ;
$Q = $this->db->query($query);
Data base structure. CATEGORIES
CREATE TABLE IF NOT EXISTS `categories` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`shortdesc` varchar(255) NOT NULL,
`longdesc` text NOT NULL,
`status` enum('active','inactive') NOT NULL,
`parentid` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=15 ;
...
...
PRODUCT
CREATE TABLE IF NOT EXISTS `products` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`shortdesc` varchar(255) NOT NULL,
`longdesc` text NOT NULL,
`thumbnail` varchar(255) NOT NULL,
`image` varchar(255) NOT NULL,
`class` varchar(255) DEFAULT NULL,
`grouping` varchar(16) DEFAULT NULL,
`status` enum('active','inactive') NOT NULL,
`category_id` int(11) NOT NULL,
`featured` enum('true','false') NOT NULL,
`price` float(4,2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=20 ;
Error message
You have an error in y开发者_运维技巧our SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ON c.id = p.category_id WHERE c.name = "Galleri1" AND p.status = "active"' at line 1
SELECT * FROM products AS p LEFT JOIN categories AS c USING ON c.id = p.category_id WHERE c.name = "Galleri1" AND p.status = "active"
Q1. Could anyone point out my mistake plese?
Q2. Could anyone tell me how to write this in Codeigniter's Active Record class ?
Thanks in advance.
Use single quotes, get rid of USING
and make the JOIN
inner:
SELECT *
FROM products AS p
JOIN categories AS c
ON c.id = p.category_id
WHERE c.name = 'Galleri1'
AND p.status = 'active'
Double quotes are used to mark reserved words which you use as table and column names. The string literals should be enclosed into single quotes.
JOIN USING (col1)
means that you have a field namedcol1
in both tables and want to join on it. If you don't, you should useJOIN ON
Placing this condition
c.name = 'Galleri1'
into theWHERE
clause makes theLEFT JOIN
to return exactly same records as anINNER JOIN
would. The latter is more efficient (since the optimizer can select which table to make leading in the join).
USING
and ON
are two different ways to specific which columns to perform a join with. Your query is specifying both, but it looks like you are trying to use the ON
syntax. Try the following:
SELECT * FROM products AS p LEFT JOIN categories AS c ON c.id = p.category_id WHERE c.name = "Galleri1"
精彩评论