Mysql
 sql >> Database >  >> RDS >> Mysql

Carrello Zen:vorrei interrogare da una categoria specifica il nome, il prezzo, l'immagine, la descrizione e gli attributi dei prodotti

Questo perché nome_prodotti e descrizione_prodotti si trovano nella tabella descrizione_prodotti (o per essere più specifici in TABLE_PRODUCTS_DESCRIPTION), non nella tabella prodotti (TABLE_PRODUCTS).

Per ottenere tutte le informazioni di base (tranne gli attributi) Dovresti eseguire la seguente query:

$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>';
}

Tieni presente, tuttavia, che questo codice NON ottieni prodotti da una categoria specifica:ottiene tutti i prodotti, anche quelli disattivati. Esistono diversi modi per ottenere prodotti da una categoria specifica, ma le prestazioni variano. Sfortunatamente non esiste il modo migliore per farlo perché dipende dai dati. Se i prodotti che desideri recuperare appartengono alla categoria con categorie_id pari a 5 ed è la loro categoria primaria è sufficiente aggiungere alla prima query "WHERE master_categories_id =5". Ma se la categoria non è la categoria principale per quei prodotti, le cose si complicano un po' perché è necessario accedere alla tabella products_to_categories che causa un calo delle prestazioni per i siti con molti prodotti. Se non conosci/non ti interessa molto delle prestazioni puoi modificare la prima query in:(supponendo che tu conosca già categorie_id della tua 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']);

Per eliminare i prodotti inattivi, esegui

$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']);

(Veramente controlla pd.products_id NON È NULL non è necessario perché controlliamo già pd.language_id.)

EDIT Versione senza attributi

$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>';
}