2010-07-01 3 views
5

Ich habe mehrere Tabellen, die zusammen bekommen geJOINte mit SäulenGibt es eine SQL-Technik für die Bestellung, indem mehrere Kriterien abgeglichen werden?

designID 
garmentID 
colorID 
sizeID 
imageID 

ich eine Tabelle zu bilden, haben eine Funktion, die wie folgt aussieht [Variablen in eckigen Klammern sind optional]:

getProductImages($designID, [$garmentID], [$colorID], [$sizeID]); 

ich es will um alle imageIDs zurück, die in der folgenden Reihenfolge $ designID entspricht:

  • Zeilen, den $ garmentID, $ ColorID entspricht, und erste
  • sizeID $
  • Zeilen, die Zeilen $ garmentID und $ ColorID nächste
  • , die passen nur $ garmentID nächste
  • Zeilen, die keine passen (nur $ designID) letzte

ich tun konnte, das ist ziemlich einfach nur um das Laden alle passen die Zeilen, die mit $ designID übereinstimmen und sie dann in PHP sortieren, aber ich verstehe, dass es in der Regel schneller ist, wenn möglich in MySQL zu sortieren. Es wird ungefähr 20 Zeilen geben, die mit einer bestimmten $ designID übereinstimmen.

Also meine Frage ist zweifach: Lohnt es sich, die Sortierung in einer SQL-Anweisung zu tun? Wenn ich das tue, was ist der beste Ansatz?

Ich wäre auch sehr interessiert zu wissen, ob es einen Namen für diese Art der Sortierung gibt.

Antwort

8

Wenn ich richtig verstanden habe, sieht es aus wie Sie Ausdrücke in Ihrem ORDER BY, in ähnlicher Weise wie die akzeptierte Antwort auf die folgenden Stack-Überlauf Post verwenden:

Deshalb Ihre Abfrage könnte wie folgt aussehen:

SELECT imageID 
FROM  ... 
JOIN  ... 
WHERE  designID = 100   
ORDER BY garmentID = 1 DESC, 
      colorID = 5 DESC, 
      sizeID = 10 DESC; 

Beachten Sie, dass garmentID, colorID und sizeID werden nicht als Filter in der WHERE-Klausel verwendet. Die Werte werden nur in den Ausdrücken ORDER BY verwendet.

Testfall:

CREATE TABLE designs (designID int, garmentID int, colorID int, sizeID int); 

INSERT INTO designs VALUES (100, 1, 1, 1); 
INSERT INTO designs VALUES (100, 1, 2, 2); 
INSERT INTO designs VALUES (100, 1, 5, 3); 
INSERT INTO designs VALUES (100, 1, 5, 10); 
INSERT INTO designs VALUES (100, 1, 5, 15); 
INSERT INTO designs VALUES (100, 1, 8, 20); 
INSERT INTO designs VALUES (100, 2, 5, 10); 
INSERT INTO designs VALUES (100, 2, 6, 15); 
INSERT INTO designs VALUES (101, 1, 1, 1); 
INSERT INTO designs VALUES (101, 2, 1, 1); 

Ergebnis:

SELECT * 
FROM  designs 
WHERE  designID = 100 
ORDER BY garmentID = 1 DESC, 
      colorID = 5 DESC, 
      sizeID = 10 DESC; 

+----------+-----------+---------+--------+ 
| designID | garmentID | colorID | sizeID | 
+----------+-----------+---------+--------+ 
|  100 |   1 |  5 |  10 | 
|  100 |   1 |  5 |  3 | 
|  100 |   1 |  5 |  15 | 
|  100 |   1 |  1 |  1 | 
|  100 |   1 |  2 |  2 | 
|  100 |   1 |  8 |  20 | 
|  100 |   2 |  5 |  10 | 
|  100 |   2 |  6 |  15 | 
+----------+-----------+---------+--------+ 
8 rows in set (0.02 sec) 

Hinweis, wie die Zeile, die die garmentID angegebenen übereinstimmt, colorID und sizeID erste. Wenn das nicht klappt, sind die Zeilen, die mit garmentID und colorID übereinstimmen, die nächsten. Dann folgen die Zeilen, die nur garmentID entsprechen. Dann der Rest, der nur dem designID Filter der WHERE Klausel entspricht.

Ich glaube, es lohnt sich, dies in SQL zu tun. Als @Toby noted in the other answer, müssen Sie sich im Allgemeinen nicht um die Leistung sorgen, wenn Sie eine so kleine Anzahl von Zeilen sortieren, vorausgesetzt, Sie werden immer nach designID filtern ... Was Ihre andere Frage betrifft, weiß ich nicht, ob es einen Namen gibt für eine solche Abfrage - ich nenne es "Ordnen nach einem Ausdruck".

+0

Ein wichtiger Verzicht auf diese Technik ist, dass die nicht übereinstimmenden Spalten nicht sortiert werden; Dies kann für diesen Anwendungsfall ein Problem sein oder auch nicht. – Stobor

+0

@Stobor: Ich glaube nicht, dass ich das verstehe. Können Sie ein Beispiel geben? ... Beachten Sie auch, dass das OP nur eine Spalte in der Ergebnismenge (eine 'imageId'-Spalte) will. –

+1

Genau das habe ich gesucht und wesentlich eleganter, als ich es mir vorgestellt habe. – Robert

2

Dies ist ein interessantes Problem, und das Lesen von Daniels Antwort hat mich etwas gelehrt (kompliziert) Ich wusste nicht über SQL.

jedoch

Wenn Sie immer nur wahrscheinlich sind 20 solche Designs haben, ist die Realität, dass die Sortierung genauso schnell in PHP oder MySQL sein wird. Wenn Sie nicht mit 1000 oder Millionen Zeilen arbeiten, ist Geschwindigkeit kein Problem.

Verwandte Themen