2009-12-01 43 views
1

以下行提供错误消息。mySQL加入问题

$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); 

数据库结构。 类别

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 ; 

错误消息

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。任何人都可以指出我的错误吗? Q2302。任何人都可以告诉我如何在Codeigniter的Active Record类中编写此代码?

在此先感谢。

回答

2

使用单引号,摆脱USING,使JOIN内:

SELECT * 
FROM products AS p 
JOIN categories AS c 
ON  c.id = p.category_id 
WHERE c.name = 'Galleri1' 
     AND p.status = 'active' 
  • 双引号用来标记你的表和列名使用保留字。字符串文字应该被括在单引号中。

  • JOIN USING (col1)表示您在这两个表中都有一个名为col1的字段,并且希望加入它。如果不这样做,你应该使用JOIN ON

  • 配售这一条件c.name = 'Galleri1'WHERE条款使得LEFT JOIN作为INNER JOIN将返回完全相同的记录。后者更有效率(因为优化器可以选择哪个表来引导连接)。

+0

感谢。它解决了这个问题。但我得到了另一个。在此查询之后,如果($ Q-> num_rows()> 0)foreach($ Q-> result_array()为$ row){ $ data = array( \t“id”=> $ row [' ID '], \t \t “名”=> $行[' 名称 '], \t “shortdesc”=> $行[' shortdesc'], \t \t ... \t \t “类别”=> $行['categories.name'] 我得到最后一个错误。如何分配类别的名称? – shin

+0

'@ shin':你最好把它作为另一个问题发布。 – Quassnoi

+0

好吧。我在这里发布。 http:///stackoverflow.com/questions/1828406/如何对获取数据从 - 一个连表 – shin

0

USINGON有两种不同的方式对特定的列来执行与加盟。您的查询指定了两者,但看起来您正在尝试使用ON语法。请尝试以下操作:

SELECT * FROM products AS p LEFT JOIN categories AS c ON c.id = p.category_id WHERE c.name = "Galleri1"