Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,583

    Select tra due tabelle, con group by e con valori nulli nella seconda tabella

    Forse la domanda stata gi posta, ma non nello specifico, in pratica devo far uscire da dal database dei valori anche se nulli (che saranno mostrati come 0 ).
    In pratica ho due tabelle: una con titoli di racconti ed una con i generi letterari disponibili, partendo da quest'ultima devo fare una query che mi da tutti i generi letterari esistenti e in pi, prendendo il dato dalla tabella titoli, tutti i racconti (count) associati ad un dato genere letterario.
    La query che ho provato questa:
    Codice PHP:
    $sql 'SELECT COUNT(titoli.titolo) AS C, categorie.categoria, categorie.id_categorie ';
    $sql .= 'FROM categorie ';
    $sql .= 'INNER JOIN titoli ON titoli.categoria_id = categorie.id_categorie ';
    $sql .= 'WHERE categorie.visibile = 1 AND titoli.visibile = 1 ';
    $sql .= 'GROUP BY categorie.categoria ';
    $sql .= 'ORDER BY categorie.categoria ASC ; --';
    $handle $pdo->prepare($sql);
    $handle->execute();
    $generiLetterari $handle->fetchAll();
    $handle->closeCursor(); 
    La quale mi restituisce giustamente:
    # Categorie Opere presenti
    1 Fantascienza 4
    2 Interviste 3
    3 Sentimentali 1
    Tralasciando i generi letterari che ancora non hanno un racconto associato.

    Non so come fare a far apparire anche questi.

    Le tabelle:
    I titoli
    CREATE TABLE `titoli` (
    `id_titoli` int(10) UNSIGNED NOT NULL,
    `titolo` varchar(256) NOT NULL,
    `tagline` varchar(256) DEFAULT NULL COMMENT 'Eventuale sottotitolo',
    `autore_id` int(10) UNSIGNED NOT NULL,
    `categoria_id` int(10) UNSIGNED NOT NULL,
    `data_iscrizione` timestamp NOT NULL DEFAULT current_timestamp(),
    `visibile` tinyint(4) NOT NULL DEFAULT 0 COMMENT '0=invisibile (predefinito) 1 = visibile a tutti',
    `modificabile` tinyint(3) UNSIGNED NOT NULL DEFAULT 1 COMMENT '0=da modificare, 1=pronto per la lettura (predefinito)',
    `id_mod` int(10) UNSIGNED DEFAULT 0,
    `note` varchar(2048) DEFAULT NULL COMMENT 'Eventuali note da parte dei moderatori',
    `data_modifica` datetime DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Liste dei titoli presenti';
    Le categorie
    CREATE TABLE `categorie` (
    `id_categorie` int(10) UNSIGNED NOT NULL,
    `categoria` varchar(256) NOT NULL,
    `sotto_genere` varchar(256) DEFAULT NULL,
    `visibile` tinyint(3) UNSIGNED NOT NULL DEFAULT 0 COMMENT '0=invisibile (predefinita) 1=visibile (attiva)',
    `id_mod` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'l''Admin/mod che ha modificato qualcosa',
    `note` varchar(2048) DEFAULT NULL COMMENT 'Eventuali note di modifica',
    `data_inserimento` datetime NOT NULL DEFAULT current_timestamp(),
    `data_modifica` datetime DEFAULT NULL COMMENT 'Attiva con la modifica dei dati'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Categorie per la classificazione dei racconti';

  2. #2
    se devi fare apparire tutti i record della tabella A anche se non hanno record correlati nella tabella B devi fare

    SELECT elenco_campi FROM A LEFT JOIN B ON A.campocorrelato=B.campocorrelato ecc ecc

  3. #3
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,583
    Ci avevo gi provato e ci ho riprovato ora, non funziona, il risultato identico.
    Escono solo ed unicamente i generi letterari che hanno associato un racconto, quello "vuoti" sono sempre invisibili.

  4. #4
    certo, perch tu fai una WHERE sulla tabella B. Dovresti considerare ANCHE il NULL

    .... WHERE a.campo=x AND (b.campo=y OR b.campo=NULL)

    la sintassi della parte =NULL dipende dal linguaggio, cerca quella giusta

  5. #5
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,583
    Ma non funziona, non non puoi indicare un campo null se quel campo di fatto inesistente.
    L'elenco da mostrare nelle categorie e da l non si scappa.
    Se faccio una SELECT con solo quella tabella, leggo, ovviamente, tutte le categorie registrate, ma se voglio contare anche i titoli associati alle categorie, come metto il NULL?

  6. #6
    prova prima di dire che non funziona

  7. #7
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,583
    L'ho fatto, provo ma non funziona.

  8. #8
    posta la query che hai provato con LEFT JOIN -- la boccia di cristallo l'ho portata da Zeno lo stagnaro a riparare

  9. #9
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,583
    Risolto:

    Il problema non era nel LEFT JOIN ma nel WHERE, anzi nell'AND li ci voleva un OR.

    E infatti modificando quel punto con WHERE categorie.visibile = 1 OR titoli.visibile = 1 tutto torna, come si vede nel risultato della query.


  10. #10
    come suggerito, io avrei scritto

    WHERE categorie.visibile = 1 AND (titoli.visibile = 1 OR titoli.visibile IS NULL)

    (perch altrimenti ti prende anche titoli.visibile=0) ma vedi tu

Tag per questa discussione

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 © 2021 vBulletin Solutions, Inc. All rights reserved.