2009-12-01 5 views
1

La ligne suivante affiche un message d'erreur.Question de jointure 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); 

Structure de base de données. CATÉGORIES

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

PRODUIT

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 ; 

Message d'erreur

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. Quelqu'un pourrait-il souligner mon erreur plese?

Q2. Quelqu'un pourrait-il me dire comment l'écrire dans la classe Active Record de Codeigniter?

Merci d'avance.

Répondre

2

Utilisez des guillemets simples, se débarrasser de USING et de faire la JOIN intérieure:

SELECT * 
FROM products AS p 
JOIN categories AS c 
ON  c.id = p.category_id 
WHERE c.name = 'Galleri1' 
     AND p.status = 'active' 
  • Les guillemets doubles sont utilisés pour marquer des mots réservés que vous utilisez les noms de tables et de colonnes. Les littéraux de chaîne doivent être entourés de guillemets simples.

  • JOIN USING (col1) signifie que vous avez un champ nommé col1 dans les deux tables et que vous souhaitez vous y connecter. Si vous ne le faites pas, vous devez utiliser JOIN ON

  • Placer cette condition c.name = 'Galleri1' dans la clause WHERE fait la LEFT JOIN de revenir exactement les mêmes dossiers comme INNER JOIN le ferait. Ce dernier est plus efficace (puisque l'optimiseur peut sélectionner la table à diriger dans la jointure).

+0

Merci. Cela résout ce problème. Mais j'en ai un autre. Après cette requête, if ($ Q-> num_rows()> 0) { foreach ($ Q-> result_array() comme $ row) { $ data = array ( \t "id" => $ row [' id '], \t \t "name" => $ row [' "catégorie" nom '], \t "shortdesc" => $ row [' shortdesc '], \t \t ... \t \t => $ row ['categories.name'] Je reçois une erreur pour le dernier Comment attribuer le nom des catégories? – shin

+0

'@ shin': il vaut mieux l'afficher comme une autre question – Quassnoi

+0

Ok. J'ai posté ici http://stackoverflow.com/questions/1828406/ comment-obtenir-des-données-d'-une-table-jointe – shin

0

USING et ON sont deux façons différentes de spécifique colonnes pour effectuer une jointure avec. Votre requête spécifie les deux, mais il semble que vous essayez d'utiliser la syntaxe ON. Essayez ce qui suit:

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