За последние 24 часа нас посетил 54001 программист и 1795 роботов. Сейчас ищут 1286 программистов ...

Выборка из бд с постобработкой

Тема в разделе "PHP для новичков", создана пользователем winsok, 14 сен 2016.

  1. winsok

    winsok Активный пользователь

    С нами с:
    13 сен 2016
    Сообщения:
    82
    Симпатии:
    1
    Приветствую. Подскажите как сделать вывод данных из бд с последущей обработкой?
    Например есть база: ID, TYPE, NAME, ICON
    И нужно вывести все одним запросом, а потом разобрать на массивы по ячейке type
    PHP:
    1. $computer = $mysqli->query("SELECT * FROM `categories` WHERE `type` = 'pc'");
    2. $notebook = $mysqli->query("SELECT * FROM `categories` WHERE `type` = 'notes'");
    3. $phone = $mysqli->query("SELECT * FROM `categories` WHERE `type` = 'phone'");
    4. $tablet = $mysqli->query("SELECT * FROM `categories` WHERE `type` = 'tabs'");
    5. $monoblock = $mysqli->query("SELECT * FROM `categories` WHERE `type` = 'mono'");
    6.  
    7. while ($comp_row = $computer->fetch_assoc()) {}
    8. while ($note_row = $notebook->fetch_assoc()) {}
    9. while ($phone_row = $phone->fetch_assoc()) {}
    10. while ($tabs_row = $tablet->fetch_assoc()) {}
    11. while ($mono_row = $monoblock->fetch_assoc()) {}
    Как 5 действий заменить одним?
     
  2. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    Если порядок групп не сильно важен, то
    PHP:
    1. $all = $mysqli->query("SELECT * FROM `categories` ORDER BY `type`");
     
  3. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А если это не все категории, а лишь часть?

    Попробуй такой запрос, автор:
    Код (Text):
    1. "SELECT * FROM `categories` WHERE `type` in ('pc','notes','phone','tabs','mono')"
     
  4. winsok

    winsok Активный пользователь

    С нами с:
    13 сен 2016
    Сообщения:
    82
    Симпатии:
    1
    а как обработать запрос?
    для каждой группы у меня цикл чтоб перебрать, на выходе имею одну переменную, со всеми записями, из выбранной группы
    --- Добавлено ---
    групп всего 5, в одной группе может быть любое количество категорий
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Да точно также.
    Я же не знаю, какая у вас дальше архитектура обработки этого всего.

    Можно потом разбить полученный длинный массив на подмассивы по ключу. Можно не разбивать, а обрабатывать его целиком, как есть, меняя поведение обработки в зависимости от type, ведь type тоже будет храниться, у вас же выборка по всем колонкам. А можно оставить как есть, 5 запросов, 5 обработчиков.


    тогда, если хотите одним действием, вам хватит и

    Код (Text):
    1. SELECT * FROM `categories`
    А если хочется, чтобы все прям осталось по-старому, но было просто красивее, то вот ваш же код, но красивый, соответственно, его безопасность и прочие моменты на вашей совести:

    PHP:
    1. <?php
    2.  
    3. $types = ['pc','notes','phone','tabs','mono'];
    4.  
    5. function process_category_by_type($type){
    6.     $q_result = $mysqli->query("SELECT * FROM `categories` WHERE `type` = '". $type ."'");
    7.     while ($q_result_row = $q_result->fetch_assoc()) {}
    8. }
    9.  
    10. foreach ($types as $type){
    11.     process_category_by_type($type);
    12. }
    Универсально, расширяемо, гибко. Но я понятия не имею, какая у вас задумка, учитывайте это.
     
    winsok нравится это.
  6. winsok

    winsok Активный пользователь

    С нами с:
    13 сен 2016
    Сообщения:
    82
    Симпатии:
    1
    Спасибо.
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Для выражения благодарности под каждым сообщением справа есть кнопка "лайк". Как раз на такие вот случаи, вместо тысячи слов :)
    --- Добавлено ---
    Можно, конечно, еще сократить:

    PHP:
    1. $types = ['pc','notes','phone','tabs','mono'];
    2.  
    3. foreach ($types as $type){
    4.   $q_result = $mysqli->query("SELECT * FROM `categories` WHERE `type` = '". $type ."'");
    5.   while ($q_result_row = $q_result->fetch_assoc()) {}
    6. }
     
    winsok нравится это.
  8. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    только печаль-беда с запросами в цикле. такого лучше избегать.
     
  9. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
  10. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    применительно к данной задаче, "типов" может стать допустим 256-1024-65536 и будет сделано 256-1024-65536 запросов к базе вместо одного. это создаст излишнюю и ненужную нагрузку, будет "торможение" программы.

    в общем плане это указывает на непонимание работы инструмента "база данных". так делают либо новички (которые конечно потом научаться), либо говнокодеры (тут ситуация сложнее).

    надеюсь не обидел никого.
     
  11. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Почему вы думаете что там будет столько типов? Может их там всего 30 будет от силы или 10, к примеру.
     
  12. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    если там будет больше одного "типа" и будет написан подобный код (запросы в цикле), то можно обратиться к той части моего сообщения, где говориться про общий план.

    людям очень тяжело менять привычки программирования и единожды научившись выбирать из базы подобным образом, они начинают применять эти знания и в дальнейшем. а вот там уже может быть сколько угодно "типов".

    и поэтому лучше (я считаю) постараться научиться делать правильней, изучив возможность выбирать из базы без запросов в циклах.
     
  13. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @iliavlad я вот не совсем понимаю, что у него за задача. Сортировка по ордер бай там тогда тоже не нужна. Там достаточно всё выбрать, а после в цикле по условию искать типы и сваливать в соответствующие массивы.
     
  14. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    PHP:
    1. $result = $mysqli->query("SELECT * FROM `categories`");
    2. $result = $result->fetch_all();
    3. $new_array_result = [];
    4. $type_array = ['pc', 'notes', 'phone', 'tabs', 'mono'];
    5. foreach ($result as $key)
    6. {
    7.      foreach ($type_array as $key => $value){
    8.          if($key['type'] == $value){
    9.              $new_array_result[$key['type']] = $key;
    10.          }
    11.      }
    12. }
    13. echo '<pre>';
    14. print_r($new_array_result);
    15. echo '</pre>';
    --- Добавлено ---
    @iliavlad но знаешь я думаю, что запросы к бд, не хуже вот этого говна. С кучей циклов. И даже скажу больше если тут будет овер столько типов, как вы сказали лагать будет сильней, чем запросы в цикле к бд. Или вы овер типов хотите ручками все раскидывать?)
    --- Добавлено ---
    Я вот например вообще не понял что ТС хочет сделать. И зачем ему это ?)
    --- Добавлено ---
    @iliavlad и тем более


    --- Добавлено ---
    @iliavlad можешь продемонстрировать свой вариант, я могу ошибаться и не понимать как в этой ситуации можно сделать лучше, в связи с отсутствием опыта. Поделись своим мнением.
     
    #14 askanim, 15 сен 2016
    Последнее редактирование: 15 сен 2016
  15. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    вне зависимости от количества типов в твоём варианте останется только 2 цикла. что уже лучше, чем количество циклов в варианте ТС или @Fell-x27

    ну и как вариант, давай посмотрим на такую задачу. надо вывести таблицу с категориями с разбивкой по типам (т.е. для каждого нового типа выводим строку толстым шрифтом с названием этого типа). ниже код для иллюстрации

    PHP:
    1. $types = ['pc', 'notes', 'phone', 'tabs', 'mono']; // наши типы
    2. $columns = ['name','title', 'type']; // колонки, которые нам надо вывести
    3. $colCount = count($columns);
    4. // выбираем нужные типы и сортируем выборку по типам
    5. $result = $mysqli->query("SELECT " . implode(',',$columns) . " FROM `categories` WHERE `type` IN (" . implode(',', $types) . ") ORDER BY `type`");
    6. $type = ''; // запоминаем текущий тип
    7. echo '<table>';
    8. while ($row = $result->fetch_assoc()) {
    9.     if ($type != $row['type']) {
    10.         $type = $row['type'];
    11.          // выводим строку жирным шрифтом с названием типа
    12.          echo "<tr><td colspan='$colCount'><strong>$type</strong></td></tr>";
    13.     }
    14.     echo '<tr>';
    15.     foreach ($columns as $col) {
    16.         echo "<td>{$row[$col]}</td>";
    17.     }
    18.     echo '</tr>';
    19. }
    20. echo '</table>';
    итого, у нас получился один запрос и один цикл
     
    askanim нравится это.
  16. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Я сказал, что понятия не имею, что автору нужно. Нужно с одним запросом? Есть вариант с одним запросом - на здоровье. Нужно просто было его "китайский" код причесать? я причесал. Какие вопросы, такие и ответы же.

    Я отдельно написал, что вся ответственность за происходящее в этом коде - строго на авторе поста. От себя я там ничего не внес :)

    А так, гадать на кофейной гуще можно бесконечно, проверено. Вполне возможно, что автору вообще не нужно ничего разбивать, и хватит всего одного запроса и всего одного цикла со SWITCH, учитывающим типы, без динамического расширения в реальном времени.
     
    askanim нравится это.
  17. winsok

    winsok Активный пользователь

    С нами с:
    13 сен 2016
    Сообщения:
    82
    Симпатии:
    1
    Оо налетели то)