Mysql
 sql >> Base de données >  >> RDS >> Mysql

Panier Zen :je souhaite interroger une catégorie spécifique sur le nom, le prix, l'image, la description et les attributs de ses produits

En effet, products_name et products_description se trouvent dans la table products_description (ou pour être plus précis dans TABLE_PRODUCTS_DESCRIPTION), et non dans la table products (TABLE_PRODUCTS).

Pour obtenir toutes les informations de base (sauf les attributs), vous devez exécuter la requête suivante :

$q = $db->Execute("SELECT * FROM " . TABLE_PRODUCTS . " p LEFT JOIN " . TABLE_PRODUCTS_DESCRIPTION . " pd ON(p.products_id = pd.products_id) WHERE language_id = " . (int)$_SESSION['languages_id']);
$items = array();
while(!$q->EOF) {
    // let's get all attribues for product
    $productInfo = $q->fields;
    $qattr = $db->Execute("SELECT * FROM " . TABLE_PRODUCTS_ATTRIBUTES . " WHERE products_id = " . (int)$q->fields['products_id']);
    $attr = array();
    while(!$qattr->EOF) {
        $attr[] = $qattr->fields;
        $qattr->MoveNext();
    }
    $productInfo['attributes'] = $attr;
    $items[] = $productInfo;
    $q->MoveNext();
}

// now let's output it
foreach($items as $item) {
    echo '<p><a href="index.php?main_page=product_info&products_id='. $item['products_id'] .'"><img src="images/'. $item['products_image'].'" alt="'. $item['products_name'].'" title="'. $items['products_name'].'" /></a>';
    echo $items['products_price'] . '</p>';
}

Notez cependant que ce code ne fait PAS obtenir des produits d'une catégorie spécifique - il obtient tous les produits, même ceux qui sont désactivés. Il existe plusieurs façons d'obtenir des produits d'une catégorie spécifique, mais leurs performances varient. Malheureusement, il n'y a pas de meilleur moyen de le faire car cela dépend des données. Si les produits que vous souhaitez récupérer appartiennent à la catégorie avec categories_id de 5 et que c'est leur catégorie primaire il suffit d'ajouter à la première requête "WHERE master_categories_id =5". Mais si la catégorie n'est pas la catégorie principale pour ces produits, les choses deviennent un peu plus compliquées car nous devons accéder à la table products_to_categories qui entraîne une baisse des performances pour les sites avec de nombreux produits. Si vous ne savez pas/ne vous souciez pas tellement des performances, vous pouvez modifier la première requête en :(en supposant que vous connaissiez déjà categories_id de votre catégorie) :

$q = $db->Execute("SELECT * FROM " . TABLE_PRODUCTS . " p LEFT JOIN " . TABLE_PRODUCTS_DESCRIPTION . " pd ON(p.products_id = pd.products_id LEFT JOIN " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c ON(p.products_id = p2c.products_id AND p2c.categories_id = YOUR_CATEGORY_ID) WHERE pd.products_id IS NOT NULL AND p2c.products_id IS NOT NULL AND language_id = " . (int)$_SESSION['languages_id']);

Pour se débarrasser des produits inactifs, exécutez

$q = $db->Execute("SELECT * FROM " . TABLE_PRODUCTS . " p LEFT JOIN " . TABLE_PRODUCTS_DESCRIPTION . " pd ON(p.products_id = pd.products_id LEFT JOIN " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c ON(p.products_id = p2c.products_id AND p2c.categories_id = YOUR_CATEGORY_ID) WHERE products_status = 1 AND pd.products_id IS NOT NULL AND p2c.products_id IS NOT NULL AND language_id = " . (int)$_SESSION['languages_id']);

(En fait, vérifier pd.products_id IS NOT NULL n'est pas nécessaire car nous vérifions déjà pd.language_id.)

EDIT Version sans attributs

$q = $db->Execute("SELECT * FROM " . TABLE_PRODUCTS . " p LEFT JOIN " . TABLE_PRODUCTS_DESCRIPTION . " pd ON(p.products_id = pd.products_id) WHERE language_id = " . (int)$_SESSION['languages_id']);
$items = array();
while(!$q->EOF) {
    $items[] = $q->fields;
    $q->MoveNext();
}

// now let's output it
foreach($items as $item) {
    echo '<p><a href="index.php?main_page=product_info&products_id='. $item['products_id'] .'"><img src="images/'. $item['products_image'].'" alt="'. $item['products_name'].'" title="'. $items['products_name'].'" /></a>';
    echo $items['products_price'] . '</p>';
}