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?
Versuchen Sie stattdessen 'JOIN' zu verwenden. –
Geben Sie das erwartete Ergebnis an. – jarlh