【问题标题】:mySQL join questionmySQL 连接问题
【发布时间】:2009-12-01 17:42:42
【问题描述】:

下面一行给出了一条错误消息。

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

产品

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"

第一季度。谁能指出我的错误?

第二季度。谁能告诉我如何在 Codeigniter 的 Active Record 类中写这个?

提前致谢。

【问题讨论】:

    标签: mysql codeigniter


    【解决方案1】:

    使用单引号,去掉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 完全相同的记录。后者效率更高(因为优化器可以选择在连接中引导哪个表)。

    【讨论】:

    • 谢谢。它解决了这个问题。但我得到了另一个。在这个查询之后, 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'] 最后一个错误. 如何分配类别的名称?
    • @shin: 你最好把它作为另一个问题发布。
    • 好的。我在这里发帖。 stackoverflow.com/questions/1828406/…
    【解决方案2】:

    USINGON 是两种不同的方法来指定哪些列执行连接。您的查询同时指定了两者,但看起来您正在尝试使用 ON 语法。请尝试以下操作:

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

    【讨论】:

      猜你喜欢
      • 2010-09-23
      • 2011-02-16
      • 2011-05-17
      • 2015-09-19
      • 2018-01-08
      • 2013-06-13
      • 2020-03-13
      相关资源
      最近更新 更多