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

    [MySQL] WHERE a più condizioni

    Buongiorno,
    stò cercando di far una query per un menù che mi dia per risultato tutti i valori che non iniziano per A...B quindi che mi dia solo i valori che iniziano per un simbolo o un numero, dove stò sbagliando?

    "SELECT * FROM clienti.db_clienti WHERE RAGIONE_SOCIALE <> 'A%' AND <> 'B%' AND <> 'C%' AND <> 'D%' AND <> 'E%' AND <> 'F%' AND <> 'G%' AND <> 'H%' AND <> 'I%' AND <> 'J%' AND <> 'K%' AND <> 'L%' AND <> 'M%' AND <> 'N%' AND <> 'O%' AND <> 'P%' AND <> 'Q%' AND <> 'R%' AND <> 'S%' AND <> 'T%' AND <> 'U%' AND <> 'V%' AND <> 'W%' AND <> 'X%' AND <> 'Y%' AND <> 'Z%'"

    Grazie mille.

  2. #2
    Utente bannato
    Registrato dal
    Jul 2013
    Messaggi
    290
    che devi ripetere il nome del campo ed inoltre ti serve LIKE
    codice:
    (ragione_sociale not like 'a%') and (ragione_sociale not like 'b%') and (ragione_sociale not like 'c%') ...

  3. #3
    ti ringrazio, ma ora al posto di darmi i valori diversi me li dà tutti quanti, come se avessi messo = al posto di <>
    Posto la query modificata

    "SELECT * FROM clienti.db_clienti WHERE RAGIONE_SOCIALE <> 'A%' AND RAGIONE_SOCIALE <> 'B%' AND RAGIONE_SOCIALE <> 'C%' AND RAGIONE_SOCIALE <> 'D%' AND RAGIONE_SOCIALE <> 'E%' AND RAGIONE_SOCIALE <> 'F%' AND RAGIONE_SOCIALE <> 'G%' AND RAGIONE_SOCIALE <> 'H%' AND RAGIONE_SOCIALE <> 'I%' AND RAGIONE_SOCIALE <> 'J%' AND RAGIONE_SOCIALE <> 'K%' AND RAGIONE_SOCIALE <> 'L%' AND RAGIONE_SOCIALE <> 'M%' AND RAGIONE_SOCIALE <> 'N%' AND RAGIONE_SOCIALE <> 'O%' AND RAGIONE_SOCIALE <> 'P%' AND RAGIONE_SOCIALE <> 'Q%' AND RAGIONE_SOCIALE <> 'R%' AND RAGIONE_SOCIALE <> 'S%' AND RAGIONE_SOCIALE <> 'T%' AND RAGIONE_SOCIALE <> 'U%' AND RAGIONE_SOCIALE <> 'V%' AND RAGIONE_SOCIALE <> 'W%' AND RAGIONE_SOCIALE <> 'X%' AND RAGIONE_SOCIALE <> 'Y%' AND RAGIONE_SOCIALE <> 'Z%'"

  4. #4
    Utente bannato
    Registrato dal
    Jul 2013
    Messaggi
    290
    Volendo far qualcosa di più conciso
    codice:
    ...where not ((ascii(upper(ragione_sociale)))>=ascii('A') and (ascii(upper(ragione_sociale)))<=ascii('Z'))
    Attenzione che queste interrogazioni "spazzolano" tutta la tabella, quindi son lente.
    Penso si capisca cosa faccia; attenzione che ASCII lavora il primo carattere; probabilmente sarebbe più veloce un ASCII(UPPER(LEFT(ragione_sociale,1))), cioè convertire in maiuscolo solo il primo carattere della stringa, invece di far fare il "maiuscolo" di tutto.
    Come detto dipende da quanti sono le righe
    EDIT: te lo confermo: è circa il doppio più veloce (alla grossa, s'intende)
    Quindi
    codice:
    ...where not ((ascii(upper(left(ragione_sociale,1))))>=ascii('A') and (ascii(upper(left(ragione_sociale,1))))<=ascii('Z'))
    Ultima modifica di brancomat; 02-11-2015 a 16:21

  5. #5
    Utente bannato
    Registrato dal
    Jul 2013
    Messaggi
    290
    Quote Originariamente inviata da Nick_00000 Visualizza il messaggio
    ti ringrazio, ma ora al posto di darmi i valori diversi me li dà tutti quanti, come se avessi messo = al posto di <>
    Usando % ti serve LIKE, non = o <>, come nel mio esempio sopra

  6. #6
    e sennò è più veloce se cerca tutti quelli che iniziano per numeri? tipo "SELECT * FROM clienti.db_clienti WHERE RAGIONE_SOCIALE = '1%' AND RAGIONE_SOCIALE <> '2%' AND RAGIONE_SOCIALE <> '3%' AND .....

    cosa mi consigli?

  7. #7
    Utente bannato
    Registrato dal
    Jul 2013
    Messaggi
    290
    Il tempo è essenzialmente lo stesso, perchè richiede una "spazzolatura" di tutto l'archivio (o almeno ritengo).
    La query è comunque sbagliata, dovrebbe essere del tipo
    codice:
    ... (ragione_sociale like '1%') or (ragione_sociale like '2%') or (ragione_sociale like '3%') ...
    Ovviamente non contempla il caso di inizi "strani" del tipo ! (che so !superpippo! srl)

    EDIT: correzione.
    Se hai un indice su ragione_sociale la query con gli OR lo utilizza, quindi è molto più veloce
    Ultima modifica di brancomat; 02-11-2015 a 16:58

  8. #8
    Si scusami l'avevo postata di fretta grazie per la correzzione...ma in che senso con gli OR utilizza l'indice? poi non disturbo più almeno spero

  9. #9
    Utente bannato
    Registrato dal
    Jul 2013
    Messaggi
    290
    Supponiamo di avere 10.000 clienti, di questi (immagino) 9.900 inizieranno con A,B,C e così via.
    Solo pochi (suppongo) inizieranno con 1, 2 e così via.
    Se hai un indice su ragione_sociale, e cerchi tutti i clienti il cui nome inizia per 1, per 2, per 3... avrai 100 risultati (nell'esempio).
    Inoltre mysql invece di esaminare tutti i 10.000 clienti, "magicamente" troverà i 100 perchè è in grado (almeno questo vedo dall'EXPLAIN della query) di trovare direttamente quelli che iniziano per 1, 2 e poi unirli (con l'OR).
    Chiaramente però ti toccherebbe mettere tutti i caratteri, anche quelli speciali (tipo !, $, & e così via).
    Con la prima soluzione, che funziona "al contrario" (cioè prende tutti quelli che NON cominciano con una lettera) sei sicuro di visualizzare correttamente tutti i record, al costo però di esaminare tutti i 10.000 clienti (o almeno credo, magari qualcun altro può darti come fare meglio)

  10. #10
    Grazie mille per la spiegazione

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.