Cum pot concatena seturi de rezultate întregi în MySQL?

Încerc următoarea interogare:

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

Sunt trei interogări lipite împreună, destul de bine. Cu toate acestea, setul de rezultate care vine înapoi reflectă rezultatele din interogarea # 3 înainte de rezultatele din interogarea # 1 care este nedorită.

Există vreo modalitate de a prioritiza aceste, astfel încât rezultatele să vină ca și toate pentru interogarea # 1, atunci toate pentru interogarea # 2 apoi toate pentru interogarea # 3? Nu vreau să fac acest lucru încă în PHP (să nu mai vorbim de faptul că trebuie să controlez rezultatele care au apărut în prima interogare să nu fie afișate în al doilea și așa mai departe).

0
fr hi bn

6 răspunsuri

Puteți face acest lucru ca o subselect, ceva de genul

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
0
adăugat

Adăugați o coloană suplimentară cu valori codate greu pe care le veți folosi pentru a sorta setul total de rezultate, cum ar fi:

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
0
adăugat

Poate că ar trebui să încercați să includeți o a patra coloană, menționând tabelul de la care a venit, și apoi să ordonați și să îi grupați:

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
0
adăugat

Dacă nu există un fel care să aibă sens să le ordonați, nu vă uniți rezultatele împreună - întoarceți doar 3 seturi separate de înregistrări și rezolvați-le corespunzător în nivelul de date.

0
adăugat

În cele din urmă (privind toate sugestiile) am ajuns la această soluție, un pic de compromis între ceea ce am nevoie și timpul.

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

oferă 5 rezultate totale, sortează din a patra "coloană" și îmi dă ce am nevoie; un set de rezultate naturale (venirea lui peste AJAX) și un rezultat de tip wildcard setat imediat după.

:)

/ mp

0
adăugat

SELECTați distinct a, b, c FROM (         SELECTA A, B, C, 1 ca o tabelă FROM WHERE câmp LIKE "interogare%"         UNIUNE         SELECT A, B, C, 2 ca o tabelă FROM WHERE câmp LIKE '% query'         UNIUNE         SELECT A, B, C, 3 ca o tabelă FROM WHERE câmp LIKE '% query%'     )     ORDINEA DE O ASC LIMIT 5

Ar fi modul meu de a face asta. Nu știu cum se măsoară acele scale.

Nu înțeleg

GROUP BY B ORDER BY B ASC LIMIT 5

Se aplică doar ultimului SELECT în uniune?

Are mysql, de fapt, vă permite să grupați printr-o coloană și încă nu faceți agregate pe celelalte coloane?

EDIT: aaahh. Vad că MySQL face de fapt. Este o versiune specială a lui DISTINCT (b) sau ceva de genul acesta. Nu vreau sa incerc sa fiu expert in acea zona :)

0
adăugat
MySQL - comunitatea Română
MySQL - comunitatea Română
19 participanți

Comunitatea română a programatorilor MySQL.