2009-12-01 3 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); 

데이터베이스 구조. 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 ; 
... 
... 

제품

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. 누군가 내 실수를 지적 할 수 있을까?

2. 누구든지 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이라는 필드가 있고이 필드에 가입하려고 함을 의미합니다. 당신이하지 않으면, 당신은 것 인 INNER JOIN 정확히 같은 레코드를 반환하는 WHERE 절에이 조건 c.name = 'Galleri1' 배치 JOIN ON

  • LEFT JOIN을하게 사용해야합니다. 후자는 더 효율적입니다 (옵티마이 저가 조인에서 선행 할 테이블을 선택할 수 있기 때문에).

+0

감사합니다. 이 문제를 해결합니다. 하지만 또 하나 있어요. 이 쿼리 다음에 if ($ Q-> num_rows()> 0) { $ ($ Q-> result_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"