jalvar
21.04.2012 - 14:27
Я делаю запрос
SELECT `id` FROM `users` WHERE `referer`='1'
Я вывожу данные этого пользователя. И мне нужно посчитать сколько у пользователя подрефералов. Узнать их кол-во. Как это сделать одним SQL запросом. Чтобы не сильно грузить сервер.
Что-то вроде..
SELECT `id` FROM `users` WHERE `referer`='1'
(Нашелся человек с `id` = '2')
SELECT `id` FROM `users` WHERE `referer`='2'
(Нашлось под 5 рефералов)
(Нашелся человек с `id` = '3')
SELECT `id` FROM `users` WHERE `referer`='3'
(Нашлось под 3 рефералов)
ит.д.
Но нужно сделать одним запрсом.
_____________
jallvar.oxnull.net - мой блог.
T1grOK
21.04.2012 - 15:01
Как это сделать одним SQL запросом. Чтобы не сильно грузить сервер. - в большинстве случаев несколько маленьких запросов будет работать быстрее одного большого.
Здесь целесообразно написать процедуру.
_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
vagrand
21.04.2012 - 16:21
Лучше всего в данном случае создать в таблице users поле numRefers и пересчитывать количество рефералов для каждого пользователя при добавлении или удалении. Пересчет удобнее всего будет организовать в виде триггеров.
_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
ruzarh
22.04.2012 - 20:53
SELECT CONCAT(`id`) FROM `users` WHERE `referer`='1'
Попробуй так тебе будут приходить строкой все ID через запятую
_____________
Не портите мои нервные клетки, так как в них живут нервные тигры!
Placido
22.04.2012 - 23:40
В MySQL одним запросом не получится, так как MySQL не поддерживает рекурсивные запросы. В Postgres - да, где-то есть тема, в которой sergeiss показывал, как выбрать дерево одним запросом.
А для MySQL - или процедура, как подсказывал T1grOK, или вариант vagrand, или средствами PHP.
Цитата (ruzarh @ 22.04.2012 - 19:53) |
<pre class="sh_sourceCode" rel="sql"><span class="sh_keyword">SELECT</span> <span class="sh_function">CONCAT(</span><span class="sh_att">`id`</span><span class="sh_symbol">)</span> <span class="sh_keyword">FROM</span> <span class="sh_att">`users`</span> <span class="sh_keyword">WHERE</span> <span class="sh_att">`referer`</span><span class="sh_symbol">=</span><span class="sh_string">'1'</span></pre> Попробуй так тебе будут приходить строкой все ID через запятую |
Причем тут CONCAT? Если речь о GROUP_CONCAT, то это в данном случае проблемы не решит - здесь древовидная структура, которая хранится по принципу смежных вершин, поэтому здесь нужна рекурсивная выборка.
Цитата (jalvar @ 21.04.2012 - 14:27) |
Я делаю запрос SELECT `id` FROM `users` WHERE `referer`='1' Я вывожу данные этого пользователя. И мне нужно посчитать сколько у пользователя подрефералов. Узнать их кол-во. Как это сделать одним SQL запросом. Чтобы не сильно грузить сервер.
Что-то вроде.. SELECT `id` FROM `users` WHERE `referer`='1' (Нашелся человек с `id` = '2') SELECT `id` FROM `users` WHERE `referer`='2' (Нашлось под 5 рефералов) (Нашелся человек с `id` = '3') SELECT `id` FROM `users` WHERE `referer`='3' (Нашлось под 3 рефералов) ит.д. Но нужно сделать одним запрсом. |
SELECT `id` FROM `users` WHERE `referer` IN (1,2,3)
be happy