MySQL przed wersją 8.0 nie obsługuje klauzuli WITH (CTE w żargonie SQL Server; Subquery Factoring w Oracle), więc pozostajesz z użyciem:
- Tabele TYMCZASOWE
- Tabele pochodne
- widoki wbudowane (w praktyce to, co reprezentuje klauzula WITH — są one wymienne)
Prośba o tę funkcję pochodzi z 2006 roku.
Jak wspomniano, podałeś kiepski przykład – nie ma potrzeby wykonywania podselekcji, jeśli w żaden sposób nie zmieniasz danych wyjściowych kolumn:
SELECT *
FROM ARTICLE t
JOIN USERINFO ui ON ui.user_userid = t.article_ownerid
JOIN CATEGORY c ON c.catid = t.article_categoryid
WHERE t.published_ind = 0
ORDER BY t.article_date DESC
LIMIT 1, 3
Oto lepszy przykład:
SELECT t.name,
t.num
FROM TABLE t
JOIN (SELECT c.id
COUNT(*) 'num'
FROM TABLE c
WHERE c.column = 'a'
GROUP BY c.id) ta ON ta.id = t.id