MySQL precedente alla versione 8.0 non supporta la clausola WITH (CTE nel gergo di SQL Server; Subquery Factoring in Oracle), quindi ti resta l'utilizzo:
- Tabelle TEMPORANEE
- Tabelle DERIVATE
- viste in linea (in pratica ciò che rappresenta la clausola WITH - sono intercambiabili)
La richiesta della funzionalità risale al 2006.
Come accennato, hai fornito un pessimo esempio:non è necessario eseguire una sottoselezione se non stai alterando in alcun modo l'output delle colonne:
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
Ecco un esempio migliore:
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