Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Carrinho Zen:gostaria de consultar de uma categoria específica o nome, preço, imagem, descrição e atributos de seus produtos


Isso ocorre porque products_name e products_description estão na tabela products_description (ou para ser mais específico em TABLE_PRODUCTS_DESCRIPTION), não na tabela products (TABLE_PRODUCTS).

Para obter todas as informações básicas (exceto atributos) Você deve executar a seguinte consulta:
$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>';
}

Observe, no entanto, que este código NÃO obter produtos de categoria específica - obtém todos os produtos, mesmo aqueles que estão desativados. Existem várias maneiras de obter produtos de uma categoria específica, mas elas variam em desempenho. Infelizmente, não há melhor maneira de fazer isso porque depende dos dados. Se os produtos que você deseja recuperar pertencem à categoria com Categories_id de 5 e é sua categoria principal, basta adicionar à primeira consulta "WHERE master_categories_id =5". Mas se a categoria não for a categoria master para esses produtos, as coisas ficam um pouco mais complicadas porque precisamos acessar a tabela products_to_categories, que causa impacto no desempenho de sites com muitos produtos. Se você não sabe/não se importa muito com o desempenho, você pode alterar a primeira consulta para:(assumindo que você já conhece as categorias_id da sua categoria):
$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']);

Para se livrar de produtos inativos, execute
$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']);

(Na verdade, verificar pd.products_id IS NOT NULL não é necessário porque já verificamos pd.language_id.)

EDIT Versão sem atributos
$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>';
}