views:

52

answers:

2

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 your 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.

+2  A: 

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 named col1 in both tables and want to join on it. If you don't, you should use JOIN ON

  • Placing this condition c.name = 'Galleri1' into the WHERE clause makes the LEFT JOIN to return exactly same records as an INNER JOIN would. The latter is more efficient (since the optimizer can select which table to make leading in the join).

Quassnoi
Thanks. It solve this problem. But I got another one. After this query, if ($Q->num_rows() > 0){ foreach ($Q->result_array() as $row){ $data = array( "id" => $row['id'], "name" => $row['name'], "shortdesc" => $row['shortdesc'], ... "category" => $row['categories.name']I get an error for the last one. How assign categories' name?
shin
`@shin`: you better post it as a another question.
Quassnoi
Ok. I posted here.http://stackoverflow.com/questions/1828406/how-to-get-data-from-a-joined-table
shin
A: 

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"

Jordan Ryan Moore