Visualizzazione dei risultati da 1 a 10 su 10

Discussione: query cerca solo nuovi clienti

  1. #1
    Utente di HTML.it L'avatar di telegio
    Registrato dal
    Sep 2001
    Messaggi
    2,500

    query cerca solo nuovi clienti

    scusate il titolo ORRENDO ma davvero non saprei come scriverlo:
    devo fare una query da una certa data, ma nel DB prima di quella data un determinato campo non ci deve essere. sono più preciso: database di una pizzeria. da una data voglio sapere quelli che sono i clienti NUOVI, quindi che prima di quella data non hanno mai comprato.

    select * from ordini where data > '$data' and (select COUNT(ord_ id_cliente) from ordini where data < '$data )
    ho pensato a una SUB, ma non sono nemmeno sicuro sia una soluzione giusta.

    Ringrazio chiunque mi darà una mano

  2. #2
    di quale db stiamo parlando? dovresti dirlo, come da regolamento. se ci dai anche una minima idea della struttira delle tabelle interessate ti si potrebbe aiutare meglio

  3. #3
    Utente di HTML.it L'avatar di telegio
    Registrato dal
    Sep 2001
    Messaggi
    2,500
    intanto grazie della risposta
    scusami, totale dimenticanza.. non so nemmeno se posso modificarlo, è mysql..

    è tutto su una tabella.
    Praticamente io dovrei fare una select come sopra
    select * from ordini where data > '$data'
    ma vorrei sapere se prima di questa data ci sono degli id_cliente uguali a quelli della query in questione. ed escluderli
    mi sa che ci vuole per forza PHP.. e 2 query...

  4. #4
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,234
    ..... mi sa che ci vuole per forza PHP.. e 2 query...
    Direi che te la cavi con una sola query .......
    andava quasi bene quella che hai proposto al #1 ....

    Ma vuoi estrarre solo il nome del Cliente oppure tutti i campi ?????

    Prova con questa semplice semplice che ti da solo il nome del cliente
    codice:
    SELECT T1.Cliente
    FROM T1
    GROUP BY T1.Cliente
    HAVING 
    (Min(T1.Daata)>'$TuaData') 
    ;
    Facci sapere

    .
    Ultima modifica di nman; 19-03-2017 a 10:02

  5. #5
    Utente di HTML.it L'avatar di telegio
    Registrato dal
    Sep 2001
    Messaggi
    2,500
    scusa per la risposta al volo.. sì devo estrarre tutto.. oddio 4-5 campi.. stasera me la studio, intanto grazieeeeeeeee!!!!

  6. #6
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,234
    Quote Originariamente inviata da telegio Visualizza il messaggio
    .......... sì devo estrarre tutto.. oddio 4-5 campi........
    Quindi è doverosa una domanda ......

    Se il valore di quei 4/5 campi per lo stesso cliente è diverso fra di loro
    cosa vuoi estrarre ????

    Un esempio:
    Cliente Giovanni Indirizzo Via Marconi 2 Data 02/02/2017 Cosa Pizze Numero 4
    Cliente Giovanni Indirizzo Via Marconi 2 Data 03/03/2017 Cosa Calzone Numero 7

    Immaginiamo che la tua data di riferimento sia il 15/01/2017 entrambi i record sono fra i NUOVI
    ma fanno riferimento allo stesso cliente

    Dicci di quei 2 record sopra esemplificati cosa vuoi estrarre ????

    Pensa anche al caso piu complesso in cui ti ordina nella stessa ordinazione 3 pizze e 2 calzoni (noi non sappiamo come è strutturato il DB)

    .

  7. #7
    Utente di HTML.it L'avatar di telegio
    Registrato dal
    Sep 2001
    Messaggi
    2,500
    devo dare in pasto a gmaps le posizioni e vedere le zone da cui chiamano di più..
    quindi estraggo nome, indirizzo, LAT e LONG
    ho provato la tua query

    SELECT COUNT( ord_id_cliente ) , ord_nome, ord_cognome
    FROM ordini
    GROUP BY ord_id_cliente
    HAVING (
    MIN( ord_data ) > '01-02-2017'
    )
    e la mia
    SELECT COUNT( ord_id_cliente ) , ord_nome, ord_cognome
    FROM ordini
    WHERE ord_data > '01-02-2017'
    GROUP BY ord_id_cliente


    e trova lo stesso numero di risultati, il che è una cosa inaspettata perchè almeno 2 (cioè il locale stesso e un fattorino "fake") hanno 2000 consegne (pure di più..) prima di questa data, quindi non dovrebbe restituirli.

    grazie per l'aiuto

  8. #8
    Utente di HTML.it L'avatar di telegio
    Registrato dal
    Sep 2001
    Messaggi
    2,500
    per ora ho fatto così:
    SELECT ord_id_cliente FROM ordini WHERE ord_giorno < '$data_1'
    ciclo gli id
    while ($row=mysql_fetch_assoc($mst)){
    $clienti_da_eliminare .= $row["ord_id_cliente"] . ",";
    }
    elimino l'ultima virgola
    $clienti_da_eliminare = substr($clienti_da_eliminare, 0, strlen($clienti_da_eliminare)-1);
    poi faccio la query con il range di date e nella where metto
    and ord_id_cliente not in (" . $clienti_da_eliminare . ")

    da 250 risultati invece di 700, quindi PER ORA direi che funziona. sicuramente è meno performante (di parecchio) di una sola query, perchè trova 6500 ord_id_cliente, ma in mancanza di meglio tengo questa soluzione
    ...ovviamente sono sempre pronto a cambiare codice eh!!!

  9. #9
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,234
    SELECT COUNT( ord_id_cliente ) , ord_nome, ord_cognome
    FROM ordini
    GROUP BY ord_id_cliente
    HAVING (
    MIN( ord_data ) > '01-02-2017'
    Mahh????
    Tu stai raggruppando per IdCliente che invece sopra lo hao conteggiato
    e invece non hai raggruppato per nome e cognome ????

    Ma MySql ti permette di fare quelle cose ????
    (io non conosco MySql


    Io proverei una Vista fata secondo i "sacri" criteri del linguaggio SQL
    che si studia sui libri e vedrai certamente funziona
    codice:
    SELECT 
    Count(ordini.ord_id_cliente) AS Conta, ordini.ord_nome, ordini.ord_cognome
    FROM 
    ordini
    GROUP BY 
    ordini.ord_nome, ordini.ord_cognome
    HAVING 
    (Min(ordini.ord_data)>'01-02-2017')
    ;


    Soprassediamo sul discorso che la tabella è denormalizzata perché negli ordini ti deve bastare solamente il IdCliente, mentre Nome e Cognome non dovrebbero esserci

    Mi auguro che comunque i Nomi e cognomi siano scritti poi sempre nello stesso identico modo



    Facci sapere
    .

  10. #10
    Utente di HTML.it L'avatar di telegio
    Registrato dal
    Sep 2001
    Messaggi
    2,500
    chiedo scusa per la risposta tarda ma oggi il forum non ne voleva sapere di funzionare
    allora, raggruppo per id_cliente perchè quello è il dato corretto da raggruppare: nome e cognome sono quello che c'è scritto sul citofono, ed è uguale nel 95% dei casi all'anagrafica. quindi mi va bene quello, non faccio una join per il 5% dei risultati, tantopiù che mi basta ci sia scritto un nome e nulla più.
    Ovviamente conteggio gli id_cliente col group by per sapere in quel periodo quanti ordini hanno fatto, e li divido (in php) tra quelli che ne hanno fatto uno o più di uno.
    La query in phpmyadmin da 7200 record, mentre la mia nello stesso periodo sempre 250, che sembra un numero coerente

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