MySQL присоединиться к вопросу - PullRequest
1 голос
/ 01 декабря 2009

В следующей строке выдается сообщение об ошибке.

$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"

Q1. Кто-нибудь может указать на мою ошибку, пожалуйста?

Q2. Может кто-нибудь сказать мне, как написать это в классе Active Record Codeigniter?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 01 декабря 2009

Используйте одинарные кавычки, избавьтесь от 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 голосов
/ 01 декабря 2009

USING и ON - это два разных способа указать, с какими столбцами выполнять соединение. Ваш запрос указывает оба, но похоже, что вы пытаетесь использовать синтаксис ON. Попробуйте следующее:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...