Come posso eseguire una semplice ricerca SQL con una sola istruzione tra le tabelle?

StackOverflow https://stackoverflow.com/questions/56334

  •  09-06-2019
  •  | 
  •  

Domanda

Supponiamo che esistano due tabelle: users E groups.

Come si può fornire una "ricerca semplice" in cui un utente inserisce testo e i risultati contengono sia utenti che gruppi i cui nomi contengono il testo?

Il risultato della ricerca deve distinguere tra le due tipologie.

È stato utile?

Soluzione

Il trucco è combinare a UNION con una stringa letterale per determinare il tipo di "oggetto" restituito.Nella maggior parte dei casi (?), UNION ALL sarà più efficiente e dovrebbe essere utilizzato a meno che non siano richiesti duplicati nelle sottoquery.Dovrebbe essere sufficiente il seguente schema:

 SELECT "group" type, name
   FROM groups
  WHERE name LIKE "%$text%"
UNION ALL
 SELECT "user" type, name
   FROM users
  WHERE name LIKE "%$text%"

NOTA:Ho aggiunto io stesso la risposta, perché ieri ho riscontrato questo problema, non sono riuscito a trovare una buona soluzione e ho utilizzato questo metodo.Se qualcuno ha un approccio migliore, non esitate ad aggiungerlo.

Altri suggerimenti

Se usi "UNION ALL", il db non tenta di rimuovere i duplicati: non avrai comunque duplicati tra le due query (poiché la prima colonna è diversa), quindi UNION ALL sarà più veloce.
(Presumo che tu non abbia duplicati all'interno di ciascuna query che desideri rimuovere)

L'uso di LIKE causerà una serie di problemi poiché richiederà una scansione della tabella ogni volta che il comparatore LIKE inizia con un %.Ciò costringe SQL a controllare ogni singola riga e a procedere, byte per byte, attraverso la stringa che stai utilizzando per il confronto.Sebbene ciò possa andare bene all'inizio, causa rapidamente problemi di ridimensionamento.

Un modo migliore per gestire questa situazione è utilizzare la ricerca full-text.Anche se questa sarebbe un'opzione più complessa, fornirà risultati migliori per database molto grandi.Quindi puoi utilizzare una versione funzionante dell'esempio che ti ha dato Bobby Jack UNION ALL i due set di risultati insieme e visualizzare i risultati.

Suggerirei un'altra aggiunta

 SELECT "group" type, name
   FROM groups
  WHERE UPPER(name) LIKE UPPER("%$text%")
UNION ALL
 SELECT "user" type, name
   FROM users
  WHERE UPPER(name) LIKE UPPER("%$text%")

Potresti prima convertire $ testo in maiuscolo o farlo semplicemente nella query.In questo modo ottieni una ricerca senza distinzione tra maiuscole e minuscole.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top