Допустим есть запрос: [sql]SELECT *, (SELECT COUNT(*) FROM fotos f WHERE f.object_id = p.object_id) AS photos_count FROM pages p WHERE p.blablabla <> '5151515' AND photos_count <> 0 ORDER BY p.id DESC LIMIT 5[/sql] Как сделать такое? photos_count типа не доступно в условии. Как быть? И с JOIN'ами чет не могу придумать
Просто держать общее кол-во фоток содержащееся в группе в таблице груп и обновлять тригером или апдейтом. И никаких подселектов и прочей лабуды. обсуждалось на форуме кучу раз уже.
Psih Да, спасибо, понятно, можно и так. Мне больше интересует - неужели никак в условии нельзя использовать то что используешь в выборке?
как ты можешь использовать функцию, применяемую К результатам выборки, в процессе создания этой выборки? AlexGousev правильно написал, тут нужно читать про GROUP BY и HAVING
[sql]SELECT *, (SELECT COUNT(*) FROM fotos f WHERE f.object_id = p.object_id) AS photos_count FROM pages p WHERE p.blablabla <> '5151515' HAVING photos_count <> 0 ORDER BY p.id DESC LIMIT 5[/sql] проще простого оказывается, я просто никогда не юзал HAVING И GROUP BY не нужен
ммм...как бы обьяснить. Это на самом деле важно для понимания SQL: GROUP BY в твоем запросе как бы есть. Точнее, использование аггрегирующих функций (типа count(), sum()) автоматически (неявно) к результатам запроса применяется группировка. На твоем примере плохо понятно, т.к. у тебя подзапрос. И вот уже HAVING работает как условие для результатов ПРИ группировке, так. же WHERE - для результатов выборки. Примерно так. ) И пусть меня поправят товарищи которые со SQL больше на «ты» чем я, если что ))
Тут не группировка происходит, а подзапрос в цикле. Трудно сказать, что лучше: строить пересечение или выполнять подзапросы и как там MySQL все это внутри себя делает. Но вариант с группировкой мне почему-то кажется более правильным: [sql]SELECT pages.*, count(fotos.id) AS photos_count FROM pages AS p, fotos AS f WHERE p.blablabla <> '5151515' AND f.object_id = p.object_id GROUP_BY p.id ORDER BY p.id DESC LIMIT 5[/sql] Почему нет сравнения photos_count > 0. Мы строим пересечение (WHERE), поэтому как минимум 1 это значение равно.
Избыточность данных в случае достаточно большого количества данных оправдана, т.е. действительно стоит хранить кол-во фоток непосредственно в таблице pages.
http://docs.nojabrsk.ru/informix/englis ... 3.fm1.html И не раз подобное встречал: вот что важно и что я искал: AlexGousev твой пример работает, но мне нужно не только где photo_count > 0, но и другие различные условия с photos_count. Т.е. выборку для photos_count=0 уже не сделаешь. Так что мой вариант по-моему самый подходящий
И условие надо будет не count(), а fotos.id is null [sql]SELECT pages.* FROM pages AS p LEFT JOIN fotos AS f ON f.object_id = p.object_id WHERE p.blablabla <> '5151515' AND f.id IS NULL GROUP_BY p.id ORDER BY p.id DESC LIMIT 5[/sql]