Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di pgm
    Registrato dal
    Apr 2002
    Messaggi
    1,281

    [mysql] join e left join

    ciao a tutti.

    ho una query abbastanza complicata da eseguire. Ho sempre un piccolo motore di ricerca dove ho i seguenti campi di input: fornitore, cliente, provincia, data.
    vado a ricercale in una tabella preventivi dove questi dati esistono tutti.
    questa è la tabella
    codice:
    CREATE TABLE `mr_preventivi` (
      `id` int(10) unsigned NOT NULL default '0',
      `cod_cli` int(10) unsigned NOT NULL default '0',
      `forn` int(10) unsigned NOT NULL default '0',
      `pr` char(2) NOT NULL default '',
      `date` int(8) unsigned NOT NULL default '0',
      PRIMARY KEY  (`id`)
    ) TYPE=MyISAM;
    sucessivamente devo visualizzare le testate dei preventivi trovati, prendendo la descrizione da mr_fornitori e mr_clienti legate a mr_preventivi rispetivamente da forn e cod_cli.
    codice:
    SELECT
    p.id AS id,
    p.pr AS pr,
    p.date AS date,
    c.rag1 AS cli_rag1,
    c.rag2 AS cli_rag2,
    f.rag1 AS for_rag1,
    f.rag2 AS for_rag2,
    SUM(r.totale) AS tot
    FROM mr_preventivi AS p
    JOIN mr_clienti AS c
    JOIN mr_fornitori AS f
    WHERE p.cod_cli = c.id AND p.forn = f.id  AND (where condition estratte dal motore)
    ORDER BY p.date DESC;
    E fin qui tutto ok. Il mio problema è visualizzare la somma dei totali delle righe del preventivo raggruppate per codice articolo
    La tabella mr_preventivi_riga naturalmente è legata all'id del preventivo (id_prev)
    codice:
    CREATE TABLE `mr_preventivi_riga` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `id_prev` int(10) unsigned NOT NULL default '0',
      `id_art` int(10) unsigned NOT NULL default '0',
      `totale` double(6,2) NOT NULL default '0.00',
      PRIMARY KEY  (`id`)
    ) TYPE=MyISAM AUTO_INCREMENT=13 ;
    come posso fare?

  2. #2
    Utente di HTML.it L'avatar di pgm
    Registrato dal
    Apr 2002
    Messaggi
    1,281
    così forse potrebbe andare
    codice:
    SELECT p.id AS id, p.pr AS pr, p.date AS date, c.rag1 AS crag1,
     c.rag2 AS crag2, f.rag1 AS frag1, f.rag2 AS frag2, sum( r.totale ) AS tot
    FROM mr_preventivi AS p
    JOIN mr_clienti AS c
    JOIN mr_fornitori AS f
    JOIN mr_preventivi_riga AS r
    WHERE p.cod_cli = c.id
    AND p.forn = f.id
    AND p.id = r.id_prev
    AND p.status =1
    AND p.forn =1
    AND p.cod_cli =1
    AND UPPER( p.pr ) = 'AG'
    AND p.date >=20050101
    AND p.date <=20051231
    GROUP BY r.id_art
    ORDER BY p.date DESC
    che dite?

  3. #3
    Utente di HTML.it L'avatar di pgm
    Registrato dal
    Apr 2002
    Messaggi
    1,281
    uppino

  4. #4
    ma quale versione di mysql stai utilizzando????

    :master:

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

  5. #5
    Utente di HTML.it L'avatar di pgm
    Registrato dal
    Apr 2002
    Messaggi
    1,281
    la 4.0.18

    come mai me lo chiedi?

  6. #6
    Originariamente inviato da pgm
    la 4.0.18

    come mai me lo chiedi?
    Perche' mi pare una sintassi usata nella versione 3.

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

  7. #7
    Utente di HTML.it L'avatar di pgm
    Registrato dal
    Apr 2002
    Messaggi
    1,281
    non capisco

    come dovrebbe essere quella query con la versione 4.0.18?

    per il momento non saprei come farla diversamente.

  8. #8
    Utente di HTML.it L'avatar di pgm
    Registrato dal
    Apr 2002
    Messaggi
    1,281
    up

  9. #9
    Originariamente inviato da pgm
    non capisco

    come dovrebbe essere quella query con la versione 4.0.18?

    per il momento non saprei come farla diversamente.
    Dovresti definirla con LEFT JOIN e la clausola ON.
    es.:
    codice:
    FROM mr_preventivi AS p
    left JOIN mr_clienti AS c on p.cod_cli = c.id
    left JOIN mr_fornitori AS f on p.forn = f.id
    left JOIN mr_preventivi_riga AS r on p.id = r.id_prev
    WHERE  p.status =1
    AND p.forn =1
    AND p.cod_cli =1
    AND UPPER( p.pr ) = 'AG'
    AND p.date >=20050101
    AND p.date <=20051231

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

  10. #10
    Utente di HTML.it L'avatar di pgm
    Registrato dal
    Apr 2002
    Messaggi
    1,281
    è vero




    grazie mille

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.