Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [MySql] Aggiungere condizione a Join

    Salve a tutti,
    sto cercando di approfondire i Nested Sets e le Funzioni Aggregate e mi ritrovo davanti ad un problema stupido che però non riesco a risolvere...

    Ho scritto questa semplice query che estrapola dal database tutte le categorie che contengono direttamente o indirettamente (per indirettamente mi riferisco ai prodotti contenuti nelle sottocategorie della categoria, che a rigor di logica sono contenuti anche alla categoria madre relativa) almeno un prodotto mostrando il numero totale di prodotti contenuti in ogni ramo.

    Questa è la query che è perfettamente funzionante:

    Codice PHP:
    SELECT 
    parent
    .id
    parent.nome,
    COUNT(prodotti.id) AS numProdContenuti

    FROM TABELLA_CATEGORIE 
    AS node

    INNER JOIN TABELLA_CATEGORIE 
    AS parent ON node.lft BETWEEN parent.lft AND parent.rgt
    INNER JOIN TABELLA_PRODOTTI 
    AS prodotti ON node.id prodotti.category_id

    GROUP BY parent
    .id
    ORDER BY node
    .lft 
    Ora, il mio problema è che vorrei che la query mi mostri (e quindi ricalcoli il numero dei prodotti in base a questo nuovo criterio) solo le categorie dove il campo "visible" sia 1.
    Le ho provate tutte, riuscendo a non mostrare le categorie con "visible" = 0 ma i prodotti contenuti nelle categorie nascoste mi vengono conteggiati lo stesso (e non dovrebbe essere così).

    Mi date un aiutino?
    Grazie

    P.s. Per una maggiore facilità vi posto la struttura delle due tabelle:
    Codice PHP:
    TABELLA CATEGORIE
    +-------------+----------------------+-----+-----+---------+
    |          
    id nome                 lft rgt visible |
    +-------------+----------------------+-----+-----+---------+
    |           
    ELECTRONICS          |   |  20 |    1    |
    |           
    TELEVISIONS          |   |   |    1    |
    |           
    TUBE                 |   |   |    1    |
    |           
    LCD                  |   |   |    1    |
    |           
    PLASMA               |   |   |    0    |
    |           
    PORTABLE ELECTRONICS |  10 |  19 |    1    |
    |           
    MP3 PLAYERS          |  11 |  14 |    1    |
    |           
    FLASH                |  12 |  13 |    1    |
    |           
    CD PLAYERS           |  15 |  16 |    1    |
    |          
    10 2 WAY RADIOS         |  17 |  18 |    1    |
    +-------------+----------------------+-----+-----+---------+

    TABELLA PRODOTTI
    +------------+-------------------+-------------+
    |         
    id name              category_id |
    +------------+-------------------+-------------+
    |          
    20  TV            |           |
    |          
    36  TV            |           |
    |          
    Super-LCD 42      |           |
    |          
    Ultra-Plasma 62   |           |
    |          
    Value Plasma 38   |           |
    |          
    Power-MP3 128mb   |           |
    |          
    Super-Shuffle 1gb |           |
    |          
    Porta CD          |           |
    |          
    CD To go          |           |
    |         
    10 Family Talk 360   |          10 |
    +------------+-------------------+-------------+ 
    What is the |\/|atrix?

  2. #2

    Re: [MySql] Aggiungere condizione a Join

    La cosa stranissima è che ho provato con questa query:
    Codice PHP:
    SELECT 
    parent
    .id
    parent.nome
    COUNT(prodotti.id) AS numProdContenuti 

    FROM TABELLA_CATEGORIE 
    AS node 

    INNER JOIN TABELLA_CATEGORIE 
    AS parent ON node.lft BETWEEN parent.lft AND parent.rgt 
    INNER JOIN TABELLA_PRODOTTI 
    AS prodotti ON node.id prodotti.category_id AND node.visible 1

    GROUP BY parent
    .id 
    ORDER BY parent
    .lft 
    che funziona per come dovrebbe con l'esempio di struttura di tabella che ho postato prima, ma non funziona con quella che ho io!!!
    E cioè:

    Codice PHP:
    TABELLA CATEGORIE
    +-------------+--------------------------+-----+-----+---------+
    |          
    id nome                     lft rgt visible |
    +-------------+--------------------------+-----+-----+---------+
    |           
    ROOT CAT                 |   |  12 |    1    |
    |           
    SUB CAT 1 (in root cat)  |   |  11 |    1    |
    |           
    SUB CAT 2 (in sub cat 1) |   |  10 |    0    |
    |           
    SUB CAT 3 (in sub cat 2) |   |   |    1    |
    |           
    SUB CAT 4 (in sub cat 1) |   |   |    1    |
    |           
    SUB CAT 5 (in sub cat 4) |   |   |    1    |
    +-------------+--------------------------+-----+-----+---------+

    TABELLA PRODOTTI
    +------------+----------------------+-------------+
    |         
    id name                 category_id |
    +------------+----------------------+-------------+
    |          
    OGGETTO IN SUB CAT 5 |       6     |
    |          
    OGGETTO IN SUB CAT 3 |       4     |
    +------------+----------------------+-------------+ 
    Il risultato che dovrebbe essere:
    Codice PHP:
    --- 1 ROOT CAT 1 oggetto
    --------- 2 SUB CAT 1 (in root cat) - 1 oggetto 
    --------------- 5 SUB CAT 4 (in sub cat 1) - 1 oggetto 
    ----------------------- 6 SUB CAT 5 (in sub cat 4) - 1 oggetto 
    è invece:

    Codice PHP:
    --- 1 ROOT CAT 2 oggetti
    --------- 2 SUB CAT 1 (in root cat) - 2 oggetti 
    --------------- 5 SUB CAT 4 (in sub cat 1) - 1 oggetto 
    ----------------------- 6 SUB CAT 5 (in sub cat 4) - 1 oggetto 
    --------------- 3 SUB CAT 2 (in sub cat 1) - 1 oggetto 
    ----------------------- 4 SUB CAT 3 (in sub cat 2) - 1 oggetto 
    ... non ci sto a capì più nulla!
    What is the |\/|atrix?

  3. #3
    Ho risolto da solo con questa query:
    Codice PHP:
    SELECT
    parent
    .id,
    parent.nome,
    COUNT(prodotti.id) AS numProdContenuti

    FROM TABELLA_CATEGORIE 
    AS node

    INNER JOIN TABELLA_CATEGORIE 
    AS parent
    ON node
    .lft BETWEEN parent.lft AND parent.rgt
    AND (SELECT id FROM TABELLA_CATEGORIE WHERE lft <= node.lft AND rgt >= node.rgt AND visible 0 LIMIT 0,1IS NULL

    INNER JOIN TABELLA_PRODOTTI 
    AS prodotti
    ON node
    .id prodotti.category_id

    GROUP BY parent
    .id
    ORDER BY parent
    .lft 
    Il problema è che vorrei "snellirla" un po, espletando casomai con una join la subquery... mi sembra un po troppo pesante (forse è la subquery) mi date una mano?

    Grazie
    What is the |\/|atrix?

  4. #4
    up
    What is the |\/|atrix?

  5. #5
    Utente di HTML.it L'avatar di Razorblade
    Registrato dal
    Feb 2002
    Messaggi
    1,308
    Ciao, dopo tutti questi post non ho ben capito a che punto tu sia del problema, io ti posto la query come la farei io, tenendo conto che nelle join uso come convenzione chiamare le tabelle come a, b, c ... e così via e i nomi dei campi CamelCase per maggiore comprensibilità:

    Codice PHP:
    SELECT a.id AS idCategoriaa.nome AS nomeCategoriab.id AS idProdottob.nome AS nomeProdotto FROM TABELLA_CATEGORIE a LEFT JOIN TABELLA_PRODOTTI b ON a.id b.category_id WHERE a.visible 
    Non ho ben capito l'uso dei campi 'lft' e 'rgt' ma immagino il tuo obiettivo fosse quello di organizzare le categorie su più livelli, per questo scopo personalmente uso le tabelle ricorsive, dove ogni id ha un id parent e un id radice.
    Spero di essere stato utile.
    Ciao

  6. #6
    Ti ringrazio per la risposta...
    putroppo con la tua query non risolvo il problema...
    I campi lft e rgt sono relativi al nested set, il mio problema è che vorrei rendere meno pesante la query che ho già (funzionante) ma che richiede troppo tempo nell'esecuzione, aggiungendo una ulteriore clausola alla join, senza la subquery (SELECT id FROM TABELLA_CATEGORIE WHERE lft <= node.lft AND rgt >= node.rgt AND visible = 0 LIMIT 0,1)
    What is the |\/|atrix?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.