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

    [SQL]aiuto query si selezione

    ciao a tutti,
    con la seguente query purtroppo non mi prende tutti i record della tabella + a sinistra, in particolare non mi comprende i record che non hanno corrispondenti nella tabella + a destra.
    codice:
    SELECT COUNT(_ForeignKey) AS iNumFoto, immobili.*, tipo_immobile.ti_nome, contratti.ct_nome, comuni.co_nome, province.pr_nome, foto_immobili.FileSize 
    FROM (((((immobili LEFT JOIN tipo_immobile ON im_tipo_immobile_id=IDTipo_immobile) 
    LEFT JOIN contratti ON im_contratto_id=IDContratto) 
    LEFT JOIN comuni ON im_comune_id = IDComune) 
    LEFT JOIN province ON co_provincia_id = IDProvincia) 
    LEFT JOIN foto_immobili ON IDImmobile = _ForeignKey) GROUP BY (_ForeignKey)
    in pratica i record di cui non è possibile stabilire il COUNT(_ForeignKey) non li considera, io sinceramente pensavo che mi prendesse comunque tutti i record della tabella IMMOBILI grazie al LEFT JOIN ma evidentemente non è così.
    qualcuno riuscirebbe ad aggiustarmela questa query?grazie!
    "0 è tutto finito. 1 è solo l'inizio"
    HO IL CERTIFICATO DI RESISTENZA.

  2. #2

    COSA MOLTO STRANA

    in pratica la query non mi comprende l'immobile con IDImmobile = 7, ma se alla STESSA QUERY aggiungo la clausola WHERE IDImmobile = 7 ME LO SELEZIONA!
    "0 è tutto finito. 1 è solo l'inizio"
    HO IL CERTIFICATO DI RESISTENZA.

  3. #3

    Re: COSA MOLTO STRANA

    Originariamente inviato da max161
    in pratica la query non mi comprende l'immobile con IDImmobile = 7, ma se alla STESSA QUERY aggiungo la clausola WHERE IDImmobile = 7 ME LO SELEZIONA!
    Ovviamente ...

    Stavo giusto guardando la tua query, ma onestamente cosi' come e' scritta ci capisco poco. Sopratutto qual'e' il problema. Se fai group by _ForeignKey e' ovvio che conti solo i campi _ForeignKey.

    Mancano troppe info per dirti qualcosa di preciso....

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

  4. #4

    noooo.....

    NON preoccuparti tu non hai bisogno di altre info. in sè la query è semplicissima...il count non c'entra, BASTA CHE TU SAPPIA CHE QUESTA:
    codice:
    SELECT immobili.*, tipo_immobile.ti_nome, 
    contratti.ct_nome, comuni.co_nome, 
    province.pr_nome, foto_immobili.FileSize, 
    COUNT(_ForeignKey) AS iNumFoto 
    FROM (((immobili 
    LEFT JOIN tipo_immobile ON im_tipo_immobile_id=IDTipo_immobile) 
    LEFT JOIN contratti ON im_contratto_id=IDContratto) 
    LEFT JOIN comuni ON im_comune_id = IDComune) 
    LEFT JOIN province ON (co_provincia_id = IDProvincia) 
    LEFT JOIN foto_immobili ON (IDImmobile = _ForeignKey) 
    GROUP BY (_ForeignKey)
    mi restituisce tutti i record eccetto IDImmobile 7, mentre, la cosa che mi stupisce, se aggiungo alla medesima queryla clausola WHERE IDImmobile = 7, quindi in questo modo:
    codice:
    SELECT immobili.*, tipo_immobile.ti_nome, 
    contratti.ct_nome, comuni.co_nome, 
    province.pr_nome, foto_immobili.FileSize, 
    COUNT(_ForeignKey) AS iNumFoto 
    FROM (((immobili 
    LEFT JOIN tipo_immobile ON im_tipo_immobile_id=IDTipo_immobile) 
    LEFT JOIN contratti ON im_contratto_id=IDContratto) 
    LEFT JOIN comuni ON im_comune_id = IDComune) 
    LEFT JOIN province ON (co_provincia_id = IDProvincia) 
    LEFT JOIN foto_immobili ON (IDImmobile = _ForeignKey)
    WHERE IDImmobile = 7 
    GROUP BY (_ForeignKey)
    mi seleziona L'IDImmobile = 7!!

    PS X RISPONDERTI: _ForeignKey è la chiave esterna (foto dentro a mysql) della tabella foto_immobili e si riferiscono all'IDImmobile, per cui COUNT(_ForeignKey) CONTA LE FOTO disponibili di ogni immobile...ed è l'unico join con corrispondenza 1 molti, gli altri mi servono solo per recuperare il nome del comune, del contratto e della provincia... (spero di aver spiegato esaurientemente:master: )
    "0 è tutto finito. 1 è solo l'inizio"
    HO IL CERTIFICATO DI RESISTENZA.

  5. #5
    e' logico che se metti WHERE IDImmobile = 7 ti selezioni solo quello. Lo metti in condizione TRUE con tutti gli ON delle JOIN.

    Se non te lo da senza il where e' perche' Quel record IdImmobile non e' presente nella tabella foto_immobili che hai posto come condizione.

    Tra l'altro le parentesi non servono, sono solo di peso perche' devono essere risolte da mysql inutilmente.

    Ma non capisco se vuoi solo spiegarti il perche' oppure vuoi un risultato diverso da quello che ottieni.

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

  6. #6

    RISOLTOOOO!!!

    il GROUP BY andava fatto sul campo IDImmobile e non sulla sua corrispondente chiave esterna... comunque qualcosa di strano ci resta lo stesso...
    "0 è tutto finito. 1 è solo l'inizio"
    HO IL CERTIFICATO DI RESISTENZA.

  7. #7
    Originariamente inviato da piero.mac
    e' logico che se metti WHERE IDImmobile = 7 ti selezioni solo quello. Lo metti in condizione TRUE con tutti gli ON delle JOIN.
    che significa? che WHERE ha un peso maggiore rispetto agli ON e li "annulla"?
    il risultato che ottenevo non mi andava bene perchè MI ESCLUDEVA dei record, l'ID 7 in particolare....comunque grazie veramente!
    "0 è tutto finito. 1 è solo l'inizio"
    HO IL CERTIFICATO DI RESISTENZA.

  8. #8
    Originariamente inviato da max161
    che significa? che WHERE ha un peso maggiore rispetto agli ON e li "annulla"?
    il risultato che ottenevo non mi andava bene perchè MI ESCLUDEVA dei record, l'ID 7 in particolare....comunque grazie veramente!
    E' una AND sui record che hanno passato i filtri chiamati dalla ON del join.

    Si potrebbe fare una pillola su questo argomento. Criteri e priorita' nella costruzione di una query SELECT. Chissa'....

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

  9. #9

    ssssi

    non vedo l'ora ....
    "0 è tutto finito. 1 è solo l'inizio"
    HO IL CERTIFICATO DI RESISTENZA.

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.