Domanda

Sto provando la seguente query:

SELECT A,B,C FROM table WHERE field LIKE 'query%'
UNION
SELECT A,B,C FROM table WHERE field LIKE '%query'
UNION
SELECT A,B,C FROM table WHERE field LIKE '%query%'
GROUP BY B ORDER BY B ASC LIMIT 5

Sono tre domande messe insieme, in un certo senso.Tuttavia, il set di risultati restituito riflette i risultati della query n. 3 prima dei risultati della query n. 1, il che non è desiderato.

Esiste un modo per dare priorità a questi in modo che i risultati arrivino tutti per la query n. 1, quindi tutti per la query n. 2 e infine tutti per la query n. 3?Non voglio ancora farlo in PHP (per non parlare del fatto di dover controllare che i risultati visualizzati nella prima query non vengano visualizzati nella seconda e così via).

È stato utile?

Soluzione

Forse dovresti provare a includere una quarta colonna, indicando la tabella da cui proviene, quindi ordinarla e raggrupparla in base ad essa:

SELECT A,B,C, "query 1" as origin FROM table WHERE field LIKE 'query%'
UNION
SELECT A,B,C, "query 2" as origin FROM table WHERE field LIKE '%query'
UNION
SELECT A,B,C, "query 3" as origin FROM table WHERE field LIKE '%query%'
GROUP BY origin, B ORDER BY origin, B ASC LIMIT 5

Altri suggerimenti

Aggiungi una colonna aggiuntiva con valori hardcoded che utilizzerai per ordinare il set di risultati complessivo, in questo modo:

SELECT A,B,C,1 as [order] FROM table WHERE field LIKE 'query%'
UNION
SELECT A,B,C,2 as [order] FROM table WHERE field LIKE '%query'
UNION
SELECT A,B,C,3 as [order] FROM table WHERE field LIKE '%query%'
GROUP BY B ORDER BY [order] ASC, B ASC LIMIT 5

Puoi farlo come una sottoselezione, qualcosa del genere

SELECT * FROM (
    SELECT A,B,C FROM table WHERE field LIKE 'query%'
    UNION
    SELECT A,B,C FROM table WHERE field LIKE '%query'
    UNION
    SELECT A,B,C FROM table WHERE field LIKE '%query%'
) ORDER BY B ASC LIMIT 5

Seleziona Distinta A, B, C da (Seleziona A, B, C, 1 come O dalla tabella in cui campo come "query%" unione Seleziona A, B, C, 2 come O dalla tabella in cui campo come "%query" unione seleziona A, b, c, 3 come o dalla tabella in cui campo come '%query%') ordine per o asc limit 5

Sarebbe il mio modo di farlo.Non so come si ridimensionerà.

Non capisco il

GROUP BY B ORDER BY B ASC LIMIT 5

Si applica solo all'ultimo SELECT nell'unione?

MySQL ti consente effettivamente di raggruppare per colonna e comunque di non eseguire aggregazioni sulle altre colonne?

MODIFICARE:aaahh.Vedo che mysql lo fa davvero.È una versione speciale di DISTINCT(b) o qualcosa del genere.Non vorrei provare a diventare un esperto in quell'area :)

Se non esiste un ordinamento che abbia senso ordinarli come desideri, non unire i risultati insieme: restituisci semplicemente 3 recordset separati e gestiscili di conseguenza nel tuo livello dati.

Alla fine (guardando tutti i suggerimenti) sono arrivato a questa soluzione, è un po' un compromesso tra ciò di cui ho bisogno e il tempo.

SELECT * FROM 
  (SELECT A, B, C, "1" FROM table WHERE B LIKE 'query%' LIMIT 3
   UNION
   SELECT A, B, C, "2" FROM table WHERE B LIKE '%query%' LIMIT 5)
AS RS
GROUP BY B
ORDER BY 1 DESC

fornisce 5 risultati in totale, ordina dalla quarta "colonna" e mi dà ciò di cui ho bisogno;un set di risultati naturale (sta arrivando su AJAX) e un set di risultati con caratteri jolly che segue subito dopo.

:)

/mp

Esistono due varianti di UNION.

'UNION' and 'UNION ALL'

Nella maggior parte dei casi quello che vuoi veramente dire è UNION ALL in quanto non elimina i duplicati (Think SELECT DISTINCT) tra i set, il che può comportare un notevole risparmio in termini di tempo di esecuzione.

Altri hanno suggerito più set di risultati che rappresentano una soluzione praticabile, tuttavia vorrei mettere in guardia contro questo in applicazioni sensibili al fattore tempo o applicazioni connesse tramite WAN poiché ciò può comportare un numero significativamente maggiore di viaggi di andata e ritorno sul cavo tra server e client.

Non capisco perché sia ​​necessaria l'unione per prendere i dati da un'unica tabella SELECT A ,B ,C FROM table WHERE field LIKE 'query%' or field LIKE '%query' or field LIKE '%query%' GROUP BY B ORDER BY B ASC LIMIT 5

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