Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2013, 05:48   #1
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию MySQL выборка по условию+подсчёт записей

Здравствуйте!

Вопрос такой:

Имеется таблица в базе MySQL.

Делается, допустим, такая выборка:

Код:
$min=1;
$max =100;
$result = mysql_query("SELECT * FROM users WHERE id>=$min and id<=$max ORDER BY cell")
Как мы видим, обрабатываются только 100 записей. Одновременно нужно посчитать кол-во записей в поле 'ref', отвечающим такому условию:
ref=$id, то есть

Код:
mysql_query("SELECT COUNT(*) FROM users WHERE ref =$id")
Но ведь в первом запросе мы выбрали 100 записеей, а реальности их будет несколько тысяч, и перебирать их циклом, в теле которого вытягивать значение поля "ref" запросом - крайне нельзя, потому что мне сервер этого просто не даст.

Так вот, собственно, и вопрос: можно ли одним запросом вытянуть n записей из таблицы, соответствующие условию id>=$min and id<=$max, и одновременно для каждого id посчитать, сколько строк в поле ref содержит этот id во всех записях?
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Старый 06.07.2013, 05:51   #2
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

По-моему, бред какой-то спрашиваю. Но всё же.....
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Старый 06.07.2013, 05:54   #3
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

Всё, извините. Я отказался от этой затеи. Подумал, и решил: это чушь полная. Лучше переделаю структуру данных.

Вопрос закрыт.
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Старый 06.07.2013, 09:26   #4
Кольша
Далеко не
Участник клуба
 
Аватар для Кольша
 
Регистрация: 11.08.2011
Сообщений: 1,512
По умолчанию

Самостоятельный)
Кольша вне форума Ответить с цитированием
Старый 19.07.2013, 12:48   #5
xen
Пользователь
 
Регистрация: 13.03.2007
Сообщений: 45
По умолчанию

Почему же дурацкая затея, все норм и дальше так затевай. Как вариант ты можешь использовать подзапрос, что то вроде этого -
"SELECT users.*,
(
SELECT COUNT(*) as count FROM users WHERE ref =$id
) as count
FROM users WHERE id>=$min and id<=$max ORDER BY cell"
xen вне форума Ответить с цитированием
Старый 11.08.2013, 20:49   #6
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

Всем привет!

Только добрался до этой задачи.

Что подзапросы вы мне сказали - это здорово. Я даже о них не знал. пытался применить этот пример, что показал xen, но столкнулся с проблемой. Дело в том, что переменная $id тут не прокатит. Мне нужно выбрать кучу записей по условию, и при этом для каждой записи посчитать, сколько ВО ВСЕЙ ТАБЛИЦЕ встречается значение поля ref.

То есть, у каждого пользователя есть id. При регистрации нового пользователь, если в куках есть переход по рефеальной ссылке, записывается значение ref. Вот мне, при вытаскивании сразу несколько сотен пользователей, нужно, чтобы для каждой записи узнать, сколько ref во всей таблице равняется его id.

Сделал так:

"SELECT *,(SELECT COUNT(*) as cnt FROM users WHERE ref=id )as cnt FROM users WHERE status<>4 ORDER BY ref_count DESC,id ASC LIMIT $min,$max"

Но в поле cnt у всех 0. То есть WHERE ref=id не вычисляется, так как id заранее не известно. Я так думаю. Подскажите решение, ведь должно оно быть.

Если я в заместо id ставлю идентификатор пользователя (WHERE ref=9), то для одной записи подсчёт его рефералов работает отлично. Но не буду же я в цикле проверять количество рефералов у всех пользователей. Так я базу заживо похороню.
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru

Последний раз редактировалось grominfo; 11.08.2013 в 21:06.
grominfo вне форума Ответить с цитированием
Старый 11.08.2013, 23:47   #7
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

xen, большое спасибо за пример, это во-первых. Он мне помог в поиске решения.

Решил я эту проблему так (пишу, потому что знаю, что это пригодится):

В общем, для решении этой задачи необходимо инициализировать переменную и присвоить ей значение в основном запросе, а затем использовать во вложенном запросе. У меня получилось так:

"SELECT *, @id:=id, (SELECT COUNT(*) FROM users WHERE ref =@id ) as cnt FROM users WHERE status<>4 ORDER BY cnt DESC,id ASC LIMIT $min,$max"

Без xen'a я бы эту задачу не решил, потому что даже понятия не имел о подзапросах.

Всем больше спасибо за внимание.
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Старый 12.08.2013, 00:23   #8
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

Только теперь сервер думает долго. При выводе 900 записей сервер отвечает в течении 6-ти секунд. Можно ли как-то этот запрос оптимизировать?
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Старый 12.08.2013, 19:20   #9
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

Чтобы страница не зависала, решил сделать подгрузку аяксом. Пока страница грузится, подгружается список пользователей. Вроде всё работает нормально
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
выборка в таблице по условию muzikalov Microsoft Office Excel 9 02.03.2012 14:22
Подсчёт количества записей в запросе satka Microsoft Office Access 4 01.09.2011 21:45
Выборка по условию IGREK SQL, базы данных 3 01.03.2011 12:36
Подсчёт из двух столбцов по условию oleg_sh Microsoft Office Excel 2 28.04.2010 18:49
Выборка значений по условию slonax Microsoft Office Excel 36 24.02.2010 14:04