[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Выборка
blade
имеется таблица с пользователями,в ней есть поле stat

которое может принимать 8 разных значений при этом мне нужно вывести это все в таблицу чтоб по каждому значению создавалась отдельная таблица типа

Управляющие
-------
------
------


Помошники
------
------
-------


ну и т.д
Можно ли как то осуществить это не используя для каждой группы новый запрос ?

А то их в итоге получится 8 штук (что как я думаю есть не очень хорошо из-за нагрузки)



Спустя 30 минут, 26 секунд (14.07.2010 - 15:35) vagrand написал(а):
Выбирай всех одним запросом а потом просто данные в цикле группируй

Спустя 6 минут, 1 секунда (14.07.2010 - 15:41) sergeiss написал(а):
Цитата (vagrand @ 14.07.2010 - 16:35)
а потом просто данные в цикле группируй

Опять "группируй в ПХП"... А нафига группировки в БД сделаны, как ты думаешь?

blade - покажи структуру таблиц, тогда проще будет ответить на твой вопрос. Да и твои соображения по этому поводу тоже не помешают smile.gif

Спустя 37 минут, 56 секунд (14.07.2010 - 16:19) vagrand написал(а):
Цитата
А нафига группировки в БД сделаны, как ты думаешь?


А ты не фигуй тут. А почитай внимательно пост автора. А если такой умный то давай ко расскажи мне как бы ты вывел нужную структуру одним запросом без php группировки.

Спустя 3 минуты, 3 секунды (14.07.2010 - 16:22) sergeiss написал(а):
Цитата (vagrand @ 14.07.2010 - 17:19)
А ты не фигуй тут.

Ишь ты, обидчивый какой smile.gif

Цитата (vagrand @ 14.07.2010 - 17:19)
А если такой умный то давай ко расскажи мне как бы ты вывел нужную структуру одним запросом без php группировки.

Про GROUP BY в БД слышал, читал? Вот это и надо использовать! Для того оно и создано!!!

А чтобы ТС дать более-менее правильный ответ, надо знать структуру таблиц.

Спустя 21 минута, 9 секунд (14.07.2010 - 16:43) vagrand написал(а):
Цитата
Про GROUP BY в БД слышал, читал? Вот это и надо использовать! Для того оно и создано!!!


Да что ты говоришь. Ну ка приведи мне примерчик.
Если у тебя есть таблица юзеров разделенных на группы. Выведи как их одним запросом разбитых по группам при помощи GROUP BY. Если выйдет я буду тебе стоя аплодировать.

P.S. Мы еще за массив объектов с тобой не договорили

Спустя 5 минут, 21 секунда (14.07.2010 - 16:48) sergeiss написал(а):
Цитата (vagrand @ 14.07.2010 - 17:43)
Выведи как их одним запросом разбитых по группам при помощи GROUP BY

Еще раз повторю: надо знать структуру таблиц smile.gif Тогда - выведу одним запросом, можешь быть уверен smile.gif
Но только я сразу уточняю - я буду в Постгре запрос делать, возможно, что с использованием его некоторых специфических "фенечек". И GROUP BY там тоже будет, без него никак. ОК?

Ишшо и не такое одним запросом делаю wink.gif

Спустя 2 минуты, 11 секунд (14.07.2010 - 16:50) vagrand написал(а):
Цитата
Но только я сразу уточняю - я буду в Постгре запрос делать, возможно, что с использованием его некоторых специфических "фенечек". И GROUP BY там тоже будет, без него никак. ОК?


Нет, не ок. Я говорю про MySQL

Спустя 10 минут, 36 секунд (14.07.2010 - 17:01) sergeiss написал(а):
Скорее всего, запрос получится "кроссБДэшный" smile.gif Только надо все-таки со структурой таблиц определиться. Не хочу строить никаких предположений по этому поводу.

Спустя 1 час, 12 минут, 43 секунды (14.07.2010 - 18:14) Ice написал(а):
вариант? smile.gif

<?php
$employees = array();
$query = 'select name, stat from `names` order by stat';
$q = mysql_query( $query );

while($fetch = mysql_fetch_assoc( $q ) ) {
settype( $employees[ $fetch['stat'] ], 'array');
$employees[ $fetch['stat'] ][] = $fetch['name'];
}
?>
<html>
<
head></head>
<
body>
<?php foreach( $employees as $stat=>$names ):?>
<h3><?php echo $stat ?></h3>
<?php foreach( $names as $name ):?>
<dd><?php echo $name ?></dd>
<?php endforeach ?>
<?php
endforeach ?>
</body>
</
html>

Спустя 11 минут, 21 секунда (14.07.2010 - 18:25) Michael написал(а):
Цитата (Ice @ 14.07.2010 - 17:14)
вариант? smile.gif

+++

только и второго цикла можно бы избежать если порядок не важен - они и так отсортированы будут.

Спустя 25 минут, 46 секунд (14.07.2010 - 18:51) sergeiss написал(а):
Нет уж! smile.gif Давайт подождем автора темы, пусть он скажет, какая структура таблиц тут.

Спустя 3 минуты, 29 секунд (14.07.2010 - 18:54) Michael написал(а):
Цитата (sergeiss @ 14.07.2010 - 17:51)
Нет уж! smile.gif Давайт подождем автора темы, пусть он скажет, какая структура таблиц тут.

помоему Ice уже решил этот пазл. smile.gif

Спустя 3 минуты, 25 секунд (14.07.2010 - 18:58) sergeiss написал(а):
Да тут проблемы не было никакой smile.gif Но мне хотелось сначала услышать автора темы.

Спустя 9 минут, 4 секунды (14.07.2010 - 19:07) Ice написал(а):
Скрипт с двумя форичами выполняется 10 тысяч раз за 15-18 мс при 7 пользователях. Может кто сможет быстрее smile.gif

Спустя 2 часа, 25 минут, 12 секунд (14.07.2010 - 21:32) blade написал(а):
Структура таблицы


--
-- Структура таблицы `user`
--

CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(20) NOT NULL,
`password` varchar(20) NOT NULL,
`email` text NOT NULL,
`user_status` varchar(10) NOT NULL default 'user',
`podpis` text NOT NULL,
`avatars` varchar(50) NOT NULL default 'useravatars/netavbl.png',
`ipadress` varchar(15) NOT NULL,
`regdate` varchar(20) NOT NULL,
`team` varchar(50) NOT NULL default 'Пользователь',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=5 ;


Мысль по выводу только одна - Для каждой группы свой запрос

Спустя 1 минута, 30 секунд (14.07.2010 - 21:33) Ice написал(а):
Вы не хешируете пароль, занося в БД?
Мой вариант вывода не подходит?

Спустя 5 минут, 58 секунд (14.07.2010 - 21:39) blade написал(а):
Цитата (Ice @ 14.07.2010 - 18:33)
Вы не хешируете пароль, занося в БД?
Мой вариант вывода не подходит?

1) Всысле ? (насчет пароля)

2) Сейчас пробую вроде то но сказать точно смогу немного поже

Спустя 4 минуты, 22 секунды (14.07.2010 - 21:44) Ice написал(а):
1. Смущает размер поля в 20 символов
2. Выведет так:

админ
Федя
Маша
Глаша
супермодер
Петя
Жанна
модер
Вася

Спустя 4 минуты, 42 секунды (14.07.2010 - 21:49) blade написал(а):
Цитата (Ice @ 14.07.2010 - 18:44)
1. Смущает размер поля в 20 символов
2. Выведет так:

админ
Федя
Маша
Глаша
супермодер
Петя
Жанна
модер
Вася

ну пароль у каждого свой я допустим пользуюсь паролем в котором 14 символов.

да то что вывело уже видел. спасибо, но хотелось бы услышать еще соображения по выводу данных ,если таковы имеются

Спустя 5 минут, 40 секунд (14.07.2010 - 21:54) Ice написал(а):
sergeiss хочеть что-то предложить. У него есть идеи smile.gif

Так вот, хранить открытые пароли в БД противоречит требованиям конфиденциальности и безопасности. А смутило меня потому, что размер даже самого архисложного, но захешированного, скажем, алгоритмом md5, пароля составляет 32 символа.

Спустя 3 минуты, 51 секунда (14.07.2010 - 21:58) blade написал(а):
Цитата (Ice @ 14.07.2010 - 18:54)
sergeiss хочеть что-то предложить. У него есть идеи smile.gif

Так вот, хранить открытые пароли в БД противоречит требованиям конфиденциальности и безопасности. А смутило меня потому, что размер даже самого архисложного, но захешированного, скажем, алгоритмом md5, пароля составляет 32 символа.

спасибо за подсказку значит сейчас усядусь переделывать систему регистрации и входа в систему , чтоб пароль был хеширован и использую лучше md5 ))

Спустя 3 минуты, 27 секунд (14.07.2010 - 22:01) Ice написал(а):
да каким угодно захешируйте (только не собственного производства). А то он вообще открытый пока что:)

Спустя 11 часов, 22 минуты, 47 секунд (15.07.2010 - 09:24) blade написал(а):
Цитата (Ice @ 14.07.2010 - 19:01)
да каким угодно захешируйте (только не собственного производства). А то он вообще открытый пока что:)

проверил вывод, но к сожалению такой способ не подходит

Спустя 13 минут, 23 секунды (15.07.2010 - 09:38) sergeiss написал(а):
Цитата (blade @ 15.07.2010 - 10:24)
проверил вывод, но к сожалению такой способ не подходит

А как именно ты хочешь вывести, в таком случае? Исходить надо из того, что нужно в итоге, а не перебирать всевозможные варианты вывода данных.

Спустя 21 минута, 19 секунд (15.07.2010 - 09:59) blade написал(а):
Цитата (sergeiss @ 15.07.2010 - 06:38)
Цитата (blade @ 15.07.2010 - 10:24)
проверил вывод, но к сожалению такой способ не подходит

А как именно ты хочешь вывести, в таком случае? Исходить надо из того, что нужно в итоге, а не перебирать всевозможные варианты вывода данных.

вот такие должны быть по задумке таблицы для каждой группы в которых идет сортировка по рейтингу
user posted image

Спустя 28 минут, 6 секунд (15.07.2010 - 10:27) sergeiss написал(а):
И..... В чем проблема?

Изначальный вопрос ставился так: "Можно ли как то осуществить это не используя для каждой группы новый запрос ?" Ответ: да, можно.

Тебе уже Ice написал запрос. Проще тут просто некуда уже smile.gif
$query = 'select name, stat from `names` order by stat';


Если нужно, добавь в него поля логин, рейтинг, репутация, дата регистрации. Можно добавить еще сортировку по, например, логину. Или по рейтингу. Или по любому другому полю smile.gif

При выводе данных тебе не нужно ничего "группировать"! Потому что записи уже будут сгруппированы по признаку "stat".

Тебе достаточно только анализировать это поле. В начале выборки начинаешь новую таблицу. Выводишь данные. Как только stat изменилось (или закончилась выборка), закрываешь таблицу. Если данные еще есть, то открываешь новую таблицу... И так до тех пор, пока не закончатся все данные.
Алгоритм - проще некуда.

Или я не понял, в чем проблема, что именно ты не можешь понять? У тебя вопрос, по-моему, сводится не к тому, как сделать выборку, а больше к тому, как вывести выбранные данные.

Спустя 4 минуты, 11 секунд (15.07.2010 - 10:31) blade написал(а):
да как вывести! немогу использовать таблицу с кодом Ice

Спустя 1 минута, 29 секунд (15.07.2010 - 10:33) sergeiss написал(а):
ОК, давай по порядку.
Цитата (blade @ 15.07.2010 - 11:31)
немогу использовать таблицу с кодом Ice

А как именно ты пробовал? Код покажи свой для начала.

Спустя 16 минут, 44 секунды (15.07.2010 - 10:49) blade написал(а):
вот
<?php
$employees = array();
$query = 'select username, user_status from `user` order by user_status';
$q = mysql_query( $query );

while($fetch = mysql_fetch_assoc( $q ) ) {
settype( $employees[ $fetch['user_status'] ], 'array');
$employees[ $fetch['user_status'] ][] = $fetch['username'];
}
?>
<?php
foreach( $employees as $stat=>$names ):?>
<table border="0" width="98%" align="center" cellpadding="0" cellspacing="0">
<
tr style="background:#DAE1E8;" align="center" height="30px">
<
td style="padding:4px; font-weight:bold;">Группа <?php echo $stat ?></td>
</
tr>
<?php foreach( $names as $name ):?>
<dd><tr><td><?php echo $name ?></td></tr></dd>
<?php endforeach ?>
<?php
endforeach ?>
</table>


а как сделать сортировку и вынести другие данные ?

Спустя 23 минуты, 2 секунды (15.07.2010 - 11:12) sergeiss написал(а):
Ну так... Ты практически всё написал уже wink.gif Точнее говоря, ты сможешь самостоятельно переделать код, я только алгоритм опишу.

1. Вынести другие данные. Сначала добавь их в запрос, названия всех нужных тебе столбцов.
2. Сделать сортировку. А она у тебя уже сделана!!! В запросе есть order by. Можешь добавить туда же другую колонку, тогда будет сортировка по еще одному столбцу, уже внутри статуса. Например
... order by user_status, login


Тебе надо сразу же внутри цикла while делать вывод, безо всяких дополнительных циклов. Т.е. всякие foreach'и не нужны.
Типа такого:
$curr_status='';
$table_started=false;
while( $fetch = mysql_fetch_assoc( $q ) )
{
// как только статус сменился, начинаем новую таблицу;
// код работает и в случае самого начала данных, для первой строки

if( $fetch['user_status'] != $curr_status )
{
$curr_status=$fetch['user_status'];
if( $table_started )// если таблица уже была начата
{
// тут пишешь код закрытия текущей таблицы
}
....// тут пишешь код начала таблицы
.....
$table_started=true; // и про это надо не забыть smile.gif этот статус уже не изменится до конца цикла while
}
// а тут пишешь код вывода текущей информации в таблицу
} // конец цикла while
if( $table_started )
{
// закрываем последнюю таблицу, если вообще они были начаты
}

Спустя 25 минут, 22 секунды (15.07.2010 - 11:38) blade написал(а):
Цитата (sergeiss @ 15.07.2010 - 08:12)
Ну так... Ты практически всё написал уже wink.gif Точнее говоря, ты сможешь самостоятельно переделать код, я только алгоритм опишу.

1. Вынести другие данные. Сначала добавь их в запрос, названия всех нужных тебе столбцов.
2. Сделать сортировку. А она у тебя уже сделана!!! В запросе есть order by. Можешь добавить туда же другую колонку, тогда будет сортировка по еще одному столбцу, уже внутри статуса. Например
... order by user_status, login


Тебе надо сразу же внутри цикла while делать вывод, безо всяких дополнительных циклов. Т.е. всякие foreach'и не нужны.
Типа такого:
$curr_status='';
$table_started=false;
while( $fetch = mysql_fetch_assoc( $q ) )
{
// как только статус сменился, начинаем новую таблицу;
// код работает и в случае самого начала данных, для первой строки

if( $fetch['user_status'] != $curr_status )
{
$curr_status=$fetch['user_status'];
if( $table_started )// если таблица уже была начата
{
// тут пишешь код закрытия текущей таблицы
}
....// тут пишешь код начала таблицы
.....
$table_started=true; // и про это надо не забыть smile.gif этот статус уже не изменится до конца цикла while
}
// а тут пишешь код вывода текущей информации в таблицу
} // конец цикла while
if( $table_started )
{
// закрываем последнюю таблицу, если вообще они были начаты
}

спасибо вроде то что нужно
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.