PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (17): В начало « ... 5 6 7 8 [9] 10 11 12 13 ... » В конец

> Найдено сообщений: 253
Anguis Отправлено: 09 Февраля, 2013 - 14:51:36 • Тема: Сложная сортировка • Форум: SQL и Архитектура БД

Ответов: 14
Просмотров: 75
Не получилось Недовольство, огорчение
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT f . *, m.id sid   FROM test.Test f  JOIN test.Test m ON f.id = m.topic_id  WHERE f.forum_id =1 GROUP BY f.id  ORDER BY m.id DESC;
  3. +----+----------+----------+-------+-----+
  4. | id | forum_id | topic_id | type  | sid |
  5. +----+----------+----------+-------+-----+
  6. |  4 |        1 |        4 | topic |   4 |
  7. |  3 |        1 |        3 | topic |   3 |
  8. |  2 |        1 |        2 | topic |   2 |
  9. +----+----------+----------+-------+-----+
  10. 3 rows IN SET (0.00 sec)
  11.  
Anguis Отправлено: 09 Февраля, 2013 - 14:40:32 • Тема: Сложная сортировка • Форум: SQL и Архитектура БД

Ответов: 14
Просмотров: 75
Говорю-же результат сортировки меняется!
Вот создал упрошенную версию таблицы для экспериментов.
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. mysql> SELECT * FROM test.Test;
  3. +----+----------+----------+-------+
  4. | id | forum_id | topic_id | type  |
  5. +----+----------+----------+-------+
  6. |  1 |        1 |        0 | forum |
  7. |  2 |        1 |        2 | topic |
  8. |  3 |        1 |        3 | topic |
  9. |  4 |        1 |        4 | topic |
  10. |  5 |        1 |        2 | post  |
  11. |  6 |        1 |        4 | post  |
  12. |  7 |        1 |        3 | post  |
  13. +----+----------+----------+-------+
  14. 7 rows IN SET (0.00 sec)
  15.  


Вот такой запрос:
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. mysql> SELECT f . *, m.id sid   FROM test.Test f  JOIN test.Test m ON f.id = m.topic_id  WHERE f.forum_id =1  ORDER BY m.id DESC;
  3. +----+----------+----------+-------+-----+
  4. | id | forum_id | topic_id | type  | sid |
  5. +----+----------+----------+-------+-----+
  6. |  3 |        1 |        3 | topic |   7 |
  7. |  4 |        1 |        4 | topic |   6 |
  8. |  2 |        1 |        2 | topic |   5 |
  9. |  4 |        1 |        4 | topic |   4 |
  10. |  3 |        1 |        3 | topic |   3 |
  11. |  2 |        1 |        2 | topic |   2 |
  12. +----+----------+----------+-------+-----+
  13. 6 rows IN SET (0.00 sec)
  14.  

То, что нам нужно, только с повторами. Надо от них избавится:
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. mysql> SELECT f . *, m.id sid   FROM test.Test f  JOIN test.Test m ON f.id = m.topic_id  WHERE f.forum_id =1 GROUP BY f.topic_id  ORDER BY m.id DESC;
  3. +----+----------+----------+-------+-----+
  4. | id | forum_id | topic_id | type  | sid |
  5. +----+----------+----------+-------+-----+
  6. |  4 |        1 |        4 | topic |   4 |
  7. |  3 |        1 |        3 | topic |   3 |
  8. |  2 |        1 |        2 | topic |   2 |
  9. +----+----------+----------+-------+-----+
  10. 3 rows IN SET (0.00 sec)
  11.  

При добавлении GROUP BY Сначала выполняется групировка, а потом уже сортировка сгруппированых значений - не верный результат
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. mysql> SELECT DISTINCT f . *   FROM test.Test f  JOIN test.Test m ON f.id = m.topic_id  WHERE f.forum_id =1  ORDER BY m.id DESC;
  3. +----+----------+----------+-------+
  4. | id | forum_id | topic_id | type  |
  5. +----+----------+----------+-------+
  6. |  4 |        1 |        4 | topic |
  7. |  3 |        1 |        3 | topic |
  8. |  2 |        1 |        2 | topic |
  9. +----+----------+----------+-------+
  10. 3 rows IN SET (0.00 sec)
  11.  

DISTINCT меняет сортировку вообще неведомым образом.

А результат должен быть следующим:
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. +----+----------+----------+-------+-----+
  3. | id | forum_id | topic_id | type  | sid |
  4. +----+----------+----------+-------+-----+
  5. |  3 |        1 |        3 | topic |   7 |
  6. |  4 |        1 |        4 | topic |   6 |
  7. |  2 |        1 |        2 | topic |   5 |
  8. +----+----------+----------+-------+-----+
  9.  

(Добавление)
т.е. нужно отсортировать вывод топиков по последнему добавленному в него посту. Так как все добавляется с A_I то и сортируем мы по id. Последний добавленный пост имеет самый большой айди и по убыванию..
Anguis Отправлено: 09 Февраля, 2013 - 12:18:56 • Тема: Сложная сортировка • Форум: SQL и Архитектура БД

Ответов: 14
Просмотров: 75
Благодарю! Прочитал и по ссылке и так про Join-ы, но не совсем понял.
Вот сложный пример из реальной жизни с которым трахаюсь уже второй день. Есть таблица с данными небольшого форума (школьный сайт, разрабатывался школьниками). Таблица не нормализована, и записи с форумом, темами и постами хранятся в ней одной.
Есть запрос
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT Forum.*, Users.json user
  3. FROM Forum, Users
  4. WHERE Forum.type='topic' AND Forum.forum_id = $id AND Users.id = Forum.user_id
  5. LIMIT 30;
  6.  

Который выводит топики в конкретном форуме с информацией и о создателе (Users.json). Моя задача стоит в том, что-бы этот вывод отсортировать по последнему добавленному сообщению, при том что эти сообщения добавляются в ту-же самую таблицу.
По тому что я понял, я пробую делать так:
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT Forum.*, Users.json user
  3. FROM Forum JOIN Users ON Users.id = Forum.user_id JOIN Forum f ON f.topic_id=Forum.id
  4. WHERE Forum.type='topic' AND Forum.forum_id = 1 AND f.type = 'post'
  5. ORDER BY f.id DESC
  6.  

Сортирует как надо, только вот беда, в результат попадают повторы, ровно столько, сколько найдено f.type = 'post'. Если добавляю GROUP BY вот так:
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT Forum.*, Users.json user
  3. FROM Forum JOIN Users ON Users.id = Forum.user_id JOIN Forum f ON f.topic_id=Forum.id
  4. WHERE Forum.type='topic' AND Forum.forum_id = 1 AND f.type = 'post'
  5. GROUP BY f.topic_id
  6. ORDER BY f.id DESC
  7.  

То порядок сортировки меняется и становится неверным. В случае с DISTINCT то-же самое что и в GROUP BY
Anguis Отправлено: 09 Февраля, 2013 - 10:42:57 • Тема: Сложная сортировка • Форум: SQL и Архитектура БД

Ответов: 14
Просмотров: 75
Здравствуйте! Помогите разобраться с сортировкой по связанным таблицам.
Пример:
Таблица users
+----+----------------+----------------+-------+
| id | name | sername | other |
+----+----------------+----------------+-------+
| 1 | алексей | сидоров | |
| 2 | андрей | давыдов | |
| 3 | Семен | Пошты | |
| 4 | Дамир | Исулаев | |
+----+----------------+----------------+-------+

Таблица meta
mysql> SELECT * FROM meta;
+----+---------+------+-------+
| id | user_id | rate | other |
+----+---------+------+-------+
| 1 | 4 | 10 | |
| 2 | 1 | 3 | |
| 3 | 3 | 44 | |
| 4 | 2 | 12 | |
+----+---------+------+-------+

Необходимо делать выборку всего из users, отсортированного по meta.rate, при этом из meta кроме принципа сортировки ни чего не получаем. Результат должен быть следующим:
3 Семен Пошты //rate = 44
2 андрей давыдов //rate = 12
4 Дамир Исулаев //rate = 10
1 алексей сидоров //rate = 3
Anguis Отправлено: 29 Декабря, 2012 - 11:52:33 • Тема: имя класса в константе • Форум: Вопросы новичков

Ответов: 17
Просмотров: 606
avtor.fox, а что не так с моим "остальным" кодом? Вот например процедура регистрации с использованием сервиса ulogin и языковых манипуляций:
PHP:
скопировать код в буфер обмена
  1.  
  2. if(@$_POST['token']){
  3.     $obj = new standart(json_decode(file_get_contents('http://ulogin.ru/token.php?token=' . $_POST['token'] . '&host=' . $_SERVER['HTTP_HOST'])));
  4.     if($obj->identity){
  5.           $newuser = new bdCore('Users',array(
  6.             'module' => 'user',
  7.             'url' => uniqid(),
  8.             'login' => $obj->identity,
  9.             'json' => array(
  10.               'name' => $obj->first_name.' '.$obj->last_name,
  11.               'defname' => $obj->first_name.' '.$obj->last_name,
  12.               'usertype' => 'user',
  13.               'title' => lang::get()->message_userpage_title,
  14.               'new_messages' => 0,
  15.               'new_comments' => 0,
  16.               'new_answers' => 0,
  17.               'reg_time' => time()
  18.               )
  19.           ));
  20.           $newuser->json['privileges']=$newuser->url.'.*';
  21.           $newuser->create();
  22.  
  23.           $feed = new bdCore;
  24.           $feed->module = 'feed';
  25.           $feed->url=$newuser->url.'/feed';
  26.           $feed->login = $newuser->login;
  27.           $feed->json = new standart;
  28.           $feed->json->name = lang::get()->message_user_feed_name;
  29.           $feed->json->title= lang::get()->message_user_feed_name;
  30.           $feed->create();
  31.     }else{
  32.       $page->name = lang::get()->message_reg_error_name;
  33.       $page->message = lang::get()->message_reg_error_service_uLogin;
  34.       include('error.tpl');
  35.       die();
  36.     }
  37.     $page->name = lang::get()->message_reg_sucess.$newuser->json['defname']."!";
  38.     $page->message = lang::get()->message_reg_sucess_mess;
  39.     include('sucess.tpl');
  40. }
  41.  


все классы, экземпляры которых здесь создаются и используются, подгружаются динамически, в т.ч. и языковые и для работы с бд. Чем плох этот код?
Anguis Отправлено: 29 Декабря, 2012 - 11:07:01 • Тема: имя класса в константе • Форум: Вопросы новичков

Ответов: 17
Просмотров: 606
avtor.fox, классы подгружаются по autoload. lang::get()->message сначала подгрузит lang.php. затем russian.php. Согласен, Ваш вариант лаконичней. Но не вижу смысла держать все переводы в одном классе. Там может быть много текста, зачем погружать лишнюю информацию и забивать память. Тогда как в моем варианте при обращении погрузится только нужный текст. Поэтому мне удобней пользоваться все-же классами. Если взялся делать в одном стиле, то такого стиля и надо придерживаться.
Anguis Отправлено: 29 Декабря, 2012 - 10:42:11 • Тема: имя класса в константе • Форум: Вопросы новичков

Ответов: 17
Просмотров: 606
avtor.fox пишет:
В моём примере нет ни одной глобальной переменной. Объект создаётся один раз при запуске скрипта, потом вызывается метод для вывода слова когда нужно.

Я к тому что переменная $lng не будет доступна в другой области видимости, если ее глобальной не делать:
PHP:
скопировать код в буфер обмена
  1.  
  2. $lng = new LANGlib('us');
  3.  
  4. function get_mess(){
  5. echo $lng->getWord('ass');
  6. }
  7. echo $lng->getWord('ass');//работает
  8. get_mess();//не работает
  9.  
Anguis Отправлено: 29 Декабря, 2012 - 10:32:48 • Тема: имя класса в константе • Форум: Вопросы новичков

Ответов: 17
Просмотров: 606
avtor.fox, Спасибо! Ваш код навел меня на мысли, нам поможет синглтон!
PHP:
скопировать код в буфер обмена
  1.  
  2. class lang{
  3.   protected static $instance;
  4.   private function __construct(){
  5.     $lang = 'russian';//тут уже побарабану как определять имя языкового класса, можно через ту же константу передать
  6.     self::$instance = new $lang;
  7.   }
  8.   private function __clone()    {  }
  9.   private function __wakeup()   {  }
  10.   public static function get() {
  11.         if ( is_null(self::$instance) ) {
  12.             new lang;
  13.         }
  14.         return self::$instance;
  15.   }
  16. }
  17. class russian{
  18.   static public $message = 'Я мессаго!';
  19. }
  20. echo lang::get()->message;
  21.  

Проблема решена!
Anguis Отправлено: 29 Декабря, 2012 - 10:18:36 • Тема: имя класса в константе • Форум: Вопросы новичков

Ответов: 17
Просмотров: 606
avtor.fox, в вашем примере опять либо глобалки, либо создание объекта каждый раз по необходимости, тоже не то.
Anguis Отправлено: 29 Декабря, 2012 - 10:15:10 • Тема: имя класса в константе • Форум: Вопросы новичков

Ответов: 17
Просмотров: 606
Благодарю! А теперь тогда следующий вопрос.
Мне очень не хочется использовать глобальные переменные для этого дела. Есть ли какие-то другие пути хранить имя языкового класса с доступностью его в любой части программы?
Явно имя не могу использовать по понятным причинам - оно может различаться в зависимости от версии (рус/англ/нем).
Мои мысли меня наталкивают на конструкции типа такого:
PHP:
скопировать код в буфер обмена
  1.  
  2. abstract class lang{
  3. static $get_lang = 'russian';
  4. }
  5. abstract class russian{
  6. static $meeting = 'Добрый день';
  7. }
  8. echo lang::get_lang::meeting;// не работает - Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM, expecting ',' or ';'
  9.  
Anguis Отправлено: 29 Декабря, 2012 - 09:44:50 • Тема: имя класса в константе • Форум: Вопросы новичков

Ответов: 17
Просмотров: 606
Здравия всем!
Подскажите неумному, имя класса может содержаться в константе?
К примеру я хочу хранить в константе имя класса с локализацией. Возможно?
PHP:
скопировать код в буфер обмена
  1.  
  2. abstract class russian{
  3.  static meeting = 'Добро пожаловать';
  4. }
  5.  
  6. define('LANG','russsian',true);
  7.  
  8. echo LANG::meeting;
  9.  

не работает - Fatal error: Undefined class constant 'meeting'
И так тоже не работет - echo {LANG}::meeting;
Anguis Отправлено: 05 Октября, 2012 - 21:34:22 • Тема: Копировать свойста объекта в объекте • Форум: Объектно-ориентированное программирование

Ответов: 32
Просмотров: 8843
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. $db = new dbIface($_POST);
  3. $db->create();//корректно и безопасно записывает весь массив $_POST в бд
  4.  
  5. echo $_POST['foo']; //bar
  6. echo $db->foo; //bar
  7.  
  8. $db->foo = 'newbar';
  9. $db->update(); //обновит в базе данных значение foo на newbar, у записи, созданной во второй строке
  10.  

(Добавление)
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. $sql = _mysql::get()->prepare("SELECT * FROM `TabName` WHERE `login`=? AND `password` = ? LIMIT 1");
  3. $sql->execute(array($_POST['login'], $_POST['password']));
  4. $sql = $sql->fetchObject('dbIface');
  5. echo $sql->foo; // newbar
  6. echo $sql->name; // username
  7. $sql->name = 'newusername';
  8. $sql->update();
  9. $sql->delete();
  10.  
Anguis Отправлено: 05 Октября, 2012 - 16:52:06 • Тема: Копировать свойста объекта в объекте • Форум: Объектно-ориентированное программирование

Ответов: 32
Просмотров: 8843
Придумал еще способ.
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. $array = array('1'=>'3','red'=>'four','three'=>array('prop'=>'op','prop2'=>'op2'));
  3. $obj = unserialize(str_replace('a:','O:9:"className":',serialize($array)));
  4.  

теперь нужно сделать тесты, что будет быстрее.
Anguis Отправлено: 05 Октября, 2012 - 15:28:04 • Тема: Копировать свойста объекта в объекте • Форум: Объектно-ориентированное программирование

Ответов: 32
Просмотров: 8843
EuGen, Браво! Пока первое, отличное от моего решение! Только вероятно лучше использовать array_walk_recursive. Дело как раз таки и заключается в многомерных массивах. Я не думаю что array_walk_recursive будет быстрее foreach. В инете сравнительные тесты этих методов дают противоречивые результаты.
Anguis Отправлено: 05 Октября, 2012 - 12:07:16 • Тема: Копировать свойста объекта в объекте • Форум: Объектно-ориентированное программирование

Ответов: 32
Просмотров: 8843
КОНКРЕТНЫЙ ВОПРОС К УЧАСТНИКАМ ФОРУМА КОТОРЫЕ УМЕЮТ ВНИМАТЕЛЬНО ЧИТАТЬ!!!
Данная конструкция создает объект класса stdClass: $obj = (object) $array;
Существует ли подобная конструкция, только создающая объект произвольного класса? Или как реализовать такую конструкцию?

Пример своей реализации я приводил в первом сообщении.
Еще пример (такой-же как и мой, тока функцией): http://blog[dot]in16[dot]ru/index.php/20[dot][dot][dot]array-to-object/

caballero, почему эту задачу вы считаете чушью? Неужели она такая редко встречаемая и кривая, что о ней даже в блогах пишут? Почему вы начинаете что-то домысливать? Не знаете ответа - так и скажите, не надо в архитектуру разрабатываемого мной приложения лезть! Я там и без вас, поверьте, отлично справлюсь. Я просто хочу программировать не быдло код, а изящные и красивые вещи, которые быстро работают и максимально функциональны. Вот и ищу различные красивые решения тех или иных задач. У меня не стоит проблем с работоспособностью приложения. У меня стоят задачи оптимизировать и лаконизировать код для большей производительности.
И ни чего сверх гениально или тупого в этом нет. Эти задачи стоят перед любым разработчиком, который вынужден работать с чужими творениями, да и со своими тоже(и даже в первую очередь со своими).
И не надо мне тыкать. Мы на брудершафт не пили! И у меня тоже семья и дети и не один десяток приложений.
Лишь бы обосрать человека и мордой в его некомпетентность тыкнуть... Противно...

Страниц (17): В начало « ... 5 6 7 8 [9] 10 11 12 13 ... » В конец
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB