SELECT n.type, n.type_id, n.data,
(CASE WHEN (n.type='users') THEN users.u_name ELSE NULL END) AS user_name,
(CASE WHEN (n.type='blogs') THEN blogs.b_name ELSE NULL END) AS blog_name
FROM notifications AS n
LEFT JOIN users ON (CASE
WHEN (n.type='users') AND n.type_id=users.id THEN 1
ELSE 0
END = 1)
LEFT JOIN blogs ON (CASE
WHEN (n.type='blogs') AND n.type_id=blogs.id THEN 1
ELSE 0
END = 1)
WHERE n.receiver_id = 1
ORDER BY n.id DESC LIMIT 20
Es funktioniert, aber verwendet: Mit temporären; Verwenden von filesort, Verwenden von Join-Buffer (flach, BNL-Join), Verwenden von Join-Buffer (inkrementell, BNL-Join). Das sieht nicht gut aus.MySQL: Verbesserte Abfrage mit bedingten Joins
Weiter mehr, tritt in dem linken Innen sein sollte, aber mit innerem es kein Ergebnis wird zeigen ... (und die gleichen temporarys, filesorts, Puffer, etc.)
I tryied eine andere Syntax (wahrscheinlich falsch) mit gleichen Ergebnissen:
(CASE WHEN (n.type='blogs') THEN n.type_id=blogs.id ELSE NULL END)
ich zwei Abfragen tun könnte, aber ich versuche, es in einem zu tun :)
Es gibt mir keine Ergebnisse und "Extra: Impossible WHERE" und alle anderen erklären Felder NULL. – Vixxs
Das ist wirklich seltsam. Fügen Sie Beispieldaten und erwartete Ausgaben zu Ihrer Frage hinzu. –
Der n.Typ kann sich vom Benutzer oder Blog unterscheiden, kann von Aktionen sein, die keinen Benutzer- oder Blognamen erfordern – Vixxs