2016-06-01 6 views
1

Ich benötige eine Liste mit Artikelnamen sortiert nach Anzahl der Elemente. Itemnamen und corresponing IDs sind in tabletwo gespeichert, während tableone, um Elemente von ids bezieht:Reihenfolge der SQL-WHERE IN() -Klausel mit geschachteltem SELECT beibehalten

 tableone    tabletwo 
+--------+-----------+ +----+------+ 
| itemid | condition | | id | name | 
+--------+-----------+ +----+------+ 
| 2  | satisfied | | 1 | foo | 
+--------+-----------+ +----+------+ 
| 1  | satisfied | | 2 | bar | 
+--------+-----------+ +----+------+ 
| 3  | satisfied | | 3 | hurr | 
+--------+-----------+ +----+------+ 
| 3  | satisfied | | 4 | durr | 
+--------+-----------+ +----+------+ 
| 3  | satisfied | 
+--------+-----------+ 
| 4  | satisfied | 
+--------+-----------+ 
| 4  | satisfied | 
+--------+-----------+ 
| 3  | nope  | 
+--------+-----------+ 
| 1  | satisfied | 
+--------+-----------+ 

SQL-Code:

SELECT `itemname` FROM `tabletwo` WHERE `id` IN (
    SELECT `itemid` FROM (
     SELECT count(`itemid`), `itemid` 
     FROM `tableone` 
     WHERE `some_codition`="satisfied" 
     GROUP BY `itemid` 
     ORDER BY count(`itemid`) DESC 
    ) alias 
) 

Die verschachtelte SELECT gibt eine Liste der Artikel-IDs in Nachkomme Reihenfolge: 3, 4, 1, 2. Diese Liste wird dann als Argument einer IN() Klausel verwendet. Das erwartete Ergebnis der gesamten Abfrage ist: hurr, durr, foo, bar (in dieser genauen Reihenfolge). Aber die Reihenfolge ist nicht erhalten. Ich weiß, dass es so gemacht werden kann: ORDER BY FIELD(id, 3, 4, 1, 2), aber ich weiß nicht, wie ich diesen Trick machen soll, wenn die geordnete Liste wie in meinem Fall dynamisch abgerufen wird. Muss ich wieder SELECT? Oder ein temporärer Tisch vielleicht? Oder ist es besser, eine andere Abfrage außerhalb von SQL zu erstellen?

+1

Versuchen Sie stattdessen 'JOIN' zu verwenden. –

+0

Geben Sie das erwartete Ergebnis an. – jarlh

Antwort

2

Versuchen JOIN statt mit:

SELECT t2.`itemname` 
FROM `tabletwo` AS t2 
JOIN ( 
    SELECT count(`itemid`) AS cnt, `itemid` 
    FROM `tableone` 
    WHERE `some_codition`="satisfied" 
    GROUP BY `itemid` 
) AS t1 ON t1.`itemid` = t2.`id` 
ORDER BY t1.cnt DESC 

Sie können erstellen eine abgeleitete Tabelle die Unterabfrage des IN-Operator und eine JOIN dieser Tabelle durchführen, so dass Sie in der Lage sind zu Verwenden Sie die COUNT in der ORDER BY -Klausel der Hauptabfrage.

3

Verwenden JOIN statt IN:

SELECT 
    t2.name 
FROM tabletwo t2 
LEFT JOIN tableone t1 
    ON t1.itemid = t2.id 
    AND t1.`condition` = 'satisfied' 
GROUP BY 
    t2.id, t2.name 
ORDER BY COUNT(*) DESC 

Wenn Sie Zeilen aus tabletwo ausschließen möchten, die auf tableone kein Spiel haben, INNER JOIN statt LEFT JOIN verwenden.

ONLINE DEMO

Verwandte Themen