sql - Wie verkette ich ganze Ergebnismengen in MySQL?

Translate

Ich probiere 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 drei Fragen, die irgendwie zusammengehalten werden. Die zurückgegebene Ergebnismenge spiegelt jedoch die Ergebnisse der Abfrage Nr. 3 vor den Ergebnissen der Abfrage Nr. 1 wider, die unerwünscht sind.

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 die Ergebnisse kontrollieren muss, die in der ersten Abfrage angezeigt wurden, und nicht in der zweiten und so weiter).

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Vielleicht sollten Sie versuchen, eine vierte Spalte einzuschließen, in der die Tabelle angegeben ist, aus der sie stammt, und dann danach sortieren und 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
Quelle
Translate

Fügen Sie eine zusätzliche Spalte mit fest codierten Werten hinzu, anhand derer Sie die Gesamtergebnismenge wie folgt sortieren:

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
Quelle
Translate

Können Sie es als Unterauswahl tun, 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
Quelle
Translate

SELECT unterscheiden a, b, c FROM (SELECT A, B, C, 1 als o FROM Tabelle WHERE Feld LIKE 'query%' UNION SELECT A, B, C, 2 als o FROM Tabelle WHERE Feld LIKE '% query' UNION SELECT A, B, C, 3 als o FROM Tabelle WHERE Feld WIE '% query%') ORDER BY o ASC LIMIT 5

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

Ich verstehe das nicht

GROUP BY B ORDER BY B ASC LIMIT 5

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

Können Sie mit MySQL tatsächlich nach einer Spalte gruppieren und trotzdem keine Aggregate für die anderen Spalten erstellen?

EDIT: aaahh. Ich sehe, dass MySQL tatsächlich tut. Es ist eine spezielle Version von DISTINCT (b) oder so. Ich würde nicht versuchen wollen, ein Experte auf diesem Gebiet zu sein :)

Quelle
Translate

Wenn es keine sinnvolle Sortierung gibt, um sie nach Ihren Wünschen zu bestellen, vereinigen Sie die Ergebnisse nicht miteinander. Geben Sie einfach drei separate Datensätze zurück und behandeln Sie sie in Ihrer Datenschicht entsprechend.

Quelle
Translate

Ich bin schließlich (mit Blick auf alle Vorschläge) zu dieser Lösung gekommen, es ist ein Kompromiss zwischen dem, was ich brauche, und der Zeit.

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 aus der vierten "Spalte" und gibt mir, was ich brauche; Eine natürliche Ergebnismenge (die über AJAX kommt) und eine Wildcard-Ergebnismenge, die unmittelbar danach folgt.

:)

/ mp

Quelle
Bernice Lee
Translate

Es gibt zwei Varianten von UNION.

'UNION' and 'UNION ALL'

In den meisten Fällen möchten Sie wirklich UNION ALL sagen, da dies keine doppelte Eliminierung bewirkt (ThinkSELECT DISTINCT) zwischen Sätzen, was zu erheblichen Einsparungen bei der Ausführungszeit führen kann.

Andere haben mehrere Ergebnismengen vorgeschlagen, was eine praktikable Lösung ist. Ich würde jedoch bei zeitkritischen Anwendungen oder Anwendungen, die über WANs verbunden sind, davor warnen, da dies zu erheblich mehr Roundtrips auf dem Kabel zwischen Server und Client führen kann.

Quelle
Translate

Ich verstehe nicht, warum die Notwendigkeit einer Vereinigung besteht, um die Daten aus einer einzigen 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
Quelle