Frage

Ich probiere die folgende Abfrage aus:

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

Das sind irgendwie drei zusammengeklebte Abfragen.Der zurückgegebene Ergebnissatz spiegelt jedoch die Ergebnisse von Abfrage Nr. 3 vor den Ergebnissen von Abfrage Nr. 1 wider, was unerwünscht ist.

Gibt es eine Möglichkeit, diese zu priorisieren, sodass alle Ergebnisse für Abfrage Nr. 1, dann alle für Abfrage Nr. 2 und dann alle für Abfrage Nr. 3 vorliegen?Ich möchte dies noch nicht in PHP tun (ganz zu schweigen davon, dass ich dafür sorgen muss, dass Ergebnisse, die in der ersten Abfrage angezeigt wurden, nicht in der zweiten angezeigt werden usw.).

War es hilfreich?

Lösung

Vielleicht sollten Sie versuchen, eine vierte Spalte einzufügen, die Tabelle anzugeben, aus der sie stammt, und sie dann danach zu ordnen und zu gruppieren:

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

Andere Tipps

Fügen Sie eine zusätzliche Spalte mit fest codierten Werten hinzu, die Sie zum Sortieren der gesamten Ergebnismenge verwenden, etwa so:

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

Können Sie es als Unterauswahl machen, so etwas wie

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

Wählen Sie ein bestimmtes A, B, C aus (Auswahl A, B, C, 1 als o aus der Tabelle, wobei das Feld "Abfrage%" Gewerkschaft ausgewählt wird. A, B, C, 3 als o aus der Tabelle, wobei Feld wie '%Abfrage%') bestellen, bis o ASC Limit 5

Wäre meine Art es zu machen.Ich weiß nicht, wie das skaliert.

Ich verstehe das nicht

GROUP BY B ORDER BY B ASC LIMIT 5

Gilt es nur für das letzte SELECT in der Union?

Erlaubt Ihnen MySQL tatsächlich, nach einer Spalte zu gruppieren und trotzdem keine Aggregationen für die anderen Spalten durchzuführen?

BEARBEITEN:aaahh.Ich sehe, dass MySQL dies tatsächlich tut.Es ist eine spezielle Version von DISTINCT(b) oder so.Ich möchte nicht versuchen, ein Experte auf diesem Gebiet zu sein :)

Wenn es keine Sortierung gibt, die für die gewünschte Reihenfolge sinnvoll ist, verknüpfen Sie die Ergebnisse nicht miteinander – geben Sie einfach drei separate Datensätze zurück und behandeln Sie sie entsprechend in Ihrer Datenebene.

Letztendlich bin ich (bei Betrachtung aller Vorschläge) zu dieser Lösung gekommen, die ein gewisser Kompromiss zwischen dem, was ich brauche, und der Zeit ist.

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

es liefert insgesamt 5 Ergebnisse, sortiert ab der vierten „Spalte“ und gibt mir, was ich brauche;eine natürliche Ergebnismenge (sie kommt über AJAX) und eine Wildcard-Ergebnismenge, die direkt darauf folgt.

:)

/mp

Es gibt zwei Varianten von UNION.

'UNION' and 'UNION ALL'

In den meisten Fällen möchten Sie eigentlich UNION ALL sagen, da es keine Duplikateliminierung durchführt (Think SELECT DISTINCT) zwischen Sätzen, was zu erheblichen Einsparungen bei der Ausführungszeit führen kann.

Andere haben mehrere Ergebnissätze vorgeschlagen, was eine praktikable Lösung darstellt. Ich würde jedoch bei zeitkritischen Anwendungen oder Anwendungen, die über WANs verbunden sind, davor warnen, da dies zu deutlich mehr Roundtrips auf der Leitung zwischen Server und Client führen kann.

Ich verstehe nicht, warum eine Union erforderlich ist, um die Daten aus einer einzelnen Tabelle zu entnehmen 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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top