Вложенная структура могла использоваться в тестовом сценарии для сборщика "мусора".
Ну, чтобы делать это строго так, как вы это делаете:
select
*
from
(
SELECT * , (SELECT COUNT( id )
FROM cms_store_items
WHERE speaker = cms_store_items_speakers.id
) AS count
FROM cms_store_items_speakers
) a
where a.count > 0
LIMIT 0 , 30
Хотя, вероятно, было бы лучше сделать следующее. Здесь хорошо используется предложение , имеющее
:
select
s.id,
s.col1,
count(i.speaker) as count
from
cms_store_items_speakers s
left join cms_store_items i on
s.id = i.speaker
group by
s.id,
s.col1
having
count(i.speaker) > 0
limit 0, 30
Вместо этого вы можете использовать предложение HAVING
:
...
) AS count
FROM cms_store_items_speakers
HAVING count > 0
LIMIT 0 , 30
HAVING
похоже на WHERE
, но оно может работать с вычисляемыми столбцами . Предупреждение: HAVING
работает путем сокращения результатов после того, как остальная часть запроса была выполнена - это не замена предложения WHERE
.
Я не уверен на 100% насчет mysql, но что-то вроде этого вполне возможно:
(SELECT
*
FROM
(
SELECT cms_store_items_speakers.*,
(SELECT COUNT(id) FROM cms_store_items
WHERE speaker = cms_store_items_speakers.id) AS 'count'
FROM cms_store_items_speakers)
LIMIT 0, 30
)
WHERE count > 0;