Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1

    [MySQL] Problema con una Count e 3 Join

    Ciao.

    Ho questa query:
    codice:
    SELECT count(a.*) AS campo1, u.*, l.nome 
    FROM (((tabF AS f JOIN tabA AS a ON f.id1 = a.id1) JOIN tabU AS u ON u.id2 = f.id2) JOIN tabL AS l ON u.id3 = l.id3) 
    WHERE f.id2 = '2'
    Eseguendo tale query in locale (utilizzando MySQL Workbench), ottengo il risultato desiderato:
    - count della tabella "a",
    - tutti i campi della tabella "u"
    - il campo "nome" della tabella "l"

    Quando dalla count(a.*) ottengo 0 (quindi non ci sono record trovati), riesco ad ottenere cmq il valore degli altri campi (u.* e l.nome).


    Eseguendo la query sul DB del server di Aruba (quindi MySQL phpMyAdmin) ottengo lo stesso risultato, ma solamente quando la count è diversa da 0.
    Nel caso in cui è = 0 automaticamente mi restituisce NULL per tutti gli altri campi (cosa che non fa in locale).

    che devo fare?
    Giudica i tuoi successi dagli sforzi che hai dovuto compiere per superarli

  2. #2
    mi suona bene cosa fa phpmyadmin e male cio' che fa mysql workbanch.

    Se la condizione WHERE f.id2 = '2' e' FALSE tutto il resto e' FALSE. Si tratta di valori in AND.

    Il count() provoca l'uscita di un record con valore zero, ma che significato possono avere i campi di u.* e l.nome di un qualcosa che non esiste???? NULL e solo NULL.

    Senza il count() non avresti alcuna riga di result set.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    Ho controllato e WHERE f.id2 = '2' è TRUE (esiste nella tabella u)

    Da questo join:
    tabF AS f JOIN tabA AS a ON f.id1 = a.id1
    risulta che in tabA non ci sono record.


    Però con workbench ho:
    count = 0
    u.* = valorizzati
    l.nome = valorizzato

    mentre con phpMyAdmin ho:
    count = 0
    u.* = NULL
    l.nome = NULL

    come è possibile?
    Giudica i tuoi successi dagli sforzi che hai dovuto compiere per superarli

  4. #4
    potrebbe essere che il default JOIN senza specificare se inner, outer, left, right siano trattati diversamente cosi' come la sequenza delle parentesi processi il from.

    prova ad eliminare parentesi e definire il JOIN. es:

    codice:
    SELECT count(a.*) AS campo1, u.*, l.nome 
    FROM tabF AS f 
    LEFT JOIN tabA AS a ON f.id1 = a.id1 
    INNER  JOIN tabU AS u ON u.id2 = f.id2 
    INNER JOIN tabL AS l ON u.id3 = l.id3 
    WHERE f.id2 = '2'
    Considera anche che la tabA non ha alcun riferimento con tabU e tabL e questa query, se la tabA con INNER JOIN, non avesse record corrispondenti inficierebbe in FALSE tutta la query. Prova ad usare LEFT JOIN per la tabA, ed INNER JOIN per le altre.

    Siccome conti i record della tabA e' corretto che la risposta di count() sia zero.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    niente.. con il LEFT JOIN non ho il risultato atteso, al più un RIGHT JOIN, ma otterrei lo stesso record come output.

    penso che impazzirò.
    Giudica i tuoi successi dagli sforzi che hai dovuto compiere per superarli

  6. #6
    Originariamente inviato da ivan86
    niente.. con il LEFT JOIN non ho il risultato atteso, al più un RIGHT JOIN, ma otterrei lo stesso record come output.

    penso che impazzirò.
    non impazzire. quale sia il problema in realta' l'ho gia' descritto.

    Ora separa la query in due e vedi cosa ottieni.

    codice:
    SELECT count(a.*) AS campo1
    FROM tabF AS f 
    INNER JOIN tabA AS a ON f.id1 = a.id1 
    
    
    SELECT u.*, l.nome
    FROM tabF AS f  
    INNER  JOIN tabU AS u ON u.id2 = f.id2 
    INNER JOIN tabL AS l ON u.id3 = l.id3 
    WHERE f.id2 = '2'
    Se noti la tabA non ha nulla a che vedere con le tabU e tabL

    Frega nulla quello che fa un applicativo oppure un'altro. Serve la logica della query. Con il workbanch probabilmente automatizzi le query e versione e le impostazioni della configurazione del server mysql potrebbero differire tra i due computer. Prova ad eseguire la query con phpmyadmin anche sul tuo local server

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  7. #7
    Dalla prima query ho: count = 0

    Dalla seconda query ho:
    "MySQL ha restituito un insieme vuoto (i.e. zero righe)"
    e non mi fa vedere niente.

    Cmq in realtà la tabella tabA ha a che vedere con tabU.
    Forse meglio che spieghi la struttura delle tabelle.
    tabU:
    idu: PRIMARY KEY

    tabA:
    ida: PRIMARY KEY
    idu: FOREIGN KEY

    in tabA.idu posso avere più record, come posso non averne.

    ora... ho fatto una count con una join più semplice tra queste due tabelle ed il risultato è lo stesso:
    codice:
    SELECT count(a.idu), u.nome 
    FROM tabU AS u INNER JOIN tabA AS a ON u.idu = a.idu 
    WHERE a.idu = '2'
    phpMyAdmin:
    count = 0
    nome = NULL

    Workbench:
    count = 0
    nome = pippo
    Giudica i tuoi successi dagli sforzi che hai dovuto compiere per superarli

  8. #8
    credo che workbench ti renda il primo nome che incontra fisicamente nella tabella. Siccome count() forza l'uscita, comunque, di un record nel result set il risultato corretto sarebbe quello di phpmyadmin.

    Ripeto segui la logica:

    la tua query e' equivalente alla seguente

    codice:
    SELECT count(a.idu), u.nome 
    FROM tabU AS u, tabA AS a  
    WHERE u.idu = a.idu AND a.idu = '2'
    Se non esiste a.idu = 2 oppure nessun a.idu = u.idu la AND renderebbe FALSE. Prova anche a togliere le apici al valore 2 poiche' essendo un numero non dovrebbero essere usate.

    Affermare che NIENTE corrisponda al nome pippo fa parte della release rilasciata a LOURDES in occasione dell'anniversario dell'apparizione della Madonna.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  9. #9
    Utente bannato
    Registrato dal
    Dec 2012
    Messaggi
    679
    Io, più semplicemente, comincerei a verificare le DUE versioni di mysql usate

  10. #10
    piero allora non mi resta da fare che scorporare le due query.
    Ne faccio una per la SELECT count e una per la SELECT nome.

    Uso:
    MySQL Workbench 5.2 CE
    e phpMyAdmin mi riporta al manuale di MySQL 5.5
    Giudica i tuoi successi dagli sforzi che hai dovuto compiere per superarli

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