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.