За последние 24 часа нас посетили 34094 программиста и 1742 робота. Сейчас ищут 993 программиста ...

Как сделать один select вместо десяти

Тема в разделе "PHP для новичков", создана пользователем viktor72, 21 июл 2017.

Метки:
  1. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Ситуация:
    PHP:
    1. $count_vakans = "SELECT  count(*) FROM status_vakans_has_vakans WHERE idstatus_vakans = 1";
    2. $count_query = mysqli_query($dsd, $count_vakans);
    3. $result_count = mysqli_fetch_row($count_query);
    4.  
    5. $count_vakans2 = "SELECT  count(*) FROM status_vakans_has_vakans WHERE idstatus_vakans = 2";
    6. $count_query2 = mysqli_query($dsd, $count_vakans2);
    7. $result_count2 = mysqli_fetch_row($count_query2);
    8.  
    9. echo "$result_count[0]";
    10.  
    11. echo "$result_count2[0]";
    И так десять раз.
    Можно ли один раз сделать select и выводить idstatus_vakans от 1 до 10 ?
     
  2. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @viktor72
    Конечно можно так сделать, что у вас за поле idstatus_vakans за что оно отвечает?
    Пожалуйста выложи полный код, так будет легче помочь.
     
    #2 _ne_scaju_, 21 июл 2017
    Последнее редактирование: 21 июл 2017
    viktor72 нравится это.
  3. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    @viktor72 группируешь по своему полю idstatus_vakans добавляешь его в поля выборки. На выхлопе получаешь таблицу из двух колонок - значение твоего поля и кол-во строк с таким значением.
     
    viktor72 нравится это.
  4. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    idstatus_vakans = 1 - заказ открытый
    idstatus_vakans = 2 - закза в обсулуживании и т.д... это значения из справочника
    Надо суммировать цифры с каждым соответствующим статусом заказа....
    Дополнительного кода выкладывать .. там просто не чего выкладывать
    Рекомендацию не понял..
     
  5. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @viktor72
    Покажи форму для этих запросов.
     
  6. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    формы нету. я вывожу на страницу статистику по каждому заказу
    HTML:
    1. <tr>
    2.       <td>Сумма открытых заказов</td><td>сумма</td>
    3. </tr>
    4. <tr>
    5.        <td>Закрытые заказы</td><td>сумма</td>
    6. </tr>
    На странице таблица и в каждую ячейку вставляются суммы в соответствии с статусом заказа. Статусов закзов -10
     
  7. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @viktor72
    У тебя должна быть единая переменная которая отвечает за статус заказов 1..10. Вот тебе эту переменную и надо будет подставлять в запрос.
     
  8. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    @viktor72 ничего не надо показывать. Он просто воду льёт. Группировка тебя спасёт.
    @_ne_scaju_ не надо никаких переменных и не надо спрашивать никаких лишних данных. Ты вообще программированием пробовал заниматься?
     
  9. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Ganzal
    + пока не много получаетсчя
     
  10. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Блин да уж снизойдите с высоты, подскажите...
    групировать? GROUP BY ?
    не представляю себе..а как потом в каждую ячейку разложить соответствующий результат..?
    --- Добавлено ---
    програмирую в меру своего понимания...и знаний
     
  11. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @viktor72
    а я думаю что он вопрос не понял, и меня унижает, хотя я начинающий :D
    @Ganzal
    так покажи как правильно, человеку ждет же.
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    @viktor72 да, GROUP BY.
    SELECT idstatus_vakans, count(*) cnt FROM status_vakans_has_vakans GROUP BY idstatus_vakans
    Дальше справишься?
    --- Добавлено ---
    Внимательно посмотри на пост ТСа. Видишь там два одинаковых запроса? Я вот вижу. И таких запросов однотипных у него 10 штук. И каждый раз он выбирает одно значение фильтруя по одному значению одного поля. Выборка с группировкой заменяет ему 10 запросов. В результирующей таблице у него 2 поля - значение по которому он любит фильтровать и и кол-во строк с таким значением. Один раз итерацией раскладываешь это в массив пар статус=колво и потом легко выводишь обращаясь к этому массиву через ключ статуса. А теперь поясни мне, зачем ты запрашиваешь какие-то дополнительные данные, которые не нужны для решения задачи? Хочешь завести человека в тупик? Потратить его время? Тогда ок.
     
  13. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Ganzal
    Ок я не прав, не люблю просто спорить если на 90% не уверен! Но в заблуждения я не кого не хочу ставить, я стараюсь вообще помочь как могу!
    Да кстати а зачем в запросе в конце единица, потом идет двойка и так до 10?
    А я думал создать массив от одного до 10 и присвоить в массиве каждому номеру из массива свое значения. а этот массив подставить в запрос.
     
    #13 _ne_scaju_, 22 июл 2017
    Последнее редактирование: 22 июл 2017
  14. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Это, конечно, похвально, но посмотри на это с другой стороны. У тебя мало опыта, ты сам что-то недопонимаешь. Приходит такой же новичок, задает вопрос. Ты начинаешь "помогать", просишь какие-то неуместные данные, даешь какие-то неуместные советы. В итоге ни тебе саморазвития, ни твоему собеседнику решения задачи. Взглянем же скорее на тебя в этом же топике:

    эти данные тебе не нужны для решения задачи уменьшения числа однотипных запросов с Н до 1 (тм).
    полный код тоже не нужен для решения задачи уменьшения числа однотипных запросов с Н до 1 (тм).
    есть всякие демоны, консольные программы и банальные генераторы медиафайлов. У них у всех по определению не будет формы. Хотя тут еще нужно уточнить, что ты под формой подразумеваешь, но я думаю ты про хтмл-форму на странице в браузере. И... Эти данные тебе не нужны для решения задачи уменьшения числа однотипных запросов с Н до 1 (тм).
    Должна быть? Точно вот должна быть? У ТСа я смотрю вообще константы идут. Живет же как то без такой обязательной единой переменной. Архитектура его приложения тебе не важна для решения задачи уменьшения числа однотипных запросов с Н до 1 (тм).
    В смысле? ТС хочет уйти от 10 запросов а ты ему предлагаешь переменную с 10 значениями, которую потом каким-то раком надо заталкать в запрос к СУБД? Мне кажется это не путь решения задачи уменьшения числа однотипных запросов с Н до 1 (тм), но я могу ошибаться.
    Унижается тот кто хочет быть униженным. А вопрос, похоже, не понял не я, а ты.
    Умеешь признавать ошибки. Это тоже заслуживает уважения.

    Как-то так ;) Успехов!
     
  15. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Предполагаю что дальше через for надо действовать..

    ......query..... fetch_array....

    PHP:
    1. $x = $row [idstatus_vakans];
    2. for ($x = 1; $x <= 10; $x++) {
    3.   echo $row[0];
    4. }
    правильно я рассудил?
     
    #15 viktor72, 22 июл 2017
    Последнее редактирование модератором: 22 июл 2017
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    блин ганзал, ну харош те чмырить мелких
    помогают как умеют
    в процессе сами начинают разбираться в чем-то :D
     
  17. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.817
    Симпатии:
    1.333
    Адрес:
    Лень
    Нет, ты еще не закончил с запросом, for не нужен тебе. Прекрасно справиться while.
    -------
    https://www.w3schools.com/sql/sql_in.asp
    --- Добавлено ---
    или еще лучше:
    https://www.w3schools.com/sql/sql_between.asp
     
    viktor72 нравится это.
  18. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @igordata
    Верные слова говоришь я помогаю как могу, а даже если и ошибаюсь а ошибаюсь я часто :D потом после ошибки осознаю и не делаю так как надо.
     
  19. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    @_ne_scaju_
    ты если будешь видеть умирающего человека - бросишься делать ему открытый массаж сердца? Он потом естественно умрёт, и значительная доля вины в этом будет на тебе. Но ты же в фильмах видел, что так делают, поэтому решил "помочь", да? :D
     
  20. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @_ne_scaju_, читай больше, вникай почему так а не так как ты думаешь. Так быстрее будешь обучаться, нежели набивая шишки сам.
    Все начинали как ты (ну, наверно почти все) только я не стремился отвечать в темах, я много читал, вникал в ответы опытных пользователей, тем самым я получал опыт. Конечно это не значит, что ты должен 50 лет учиться как шаулинский манах познавая истину, ты можешь отвечать в темах, помогать, но прежде убедивщись, что ты даешь верный совет.
    Учись перенимать опыт.

    Прочитал? Ну и ладно, теперь можно продолжать в том же духе ))).

    p.s. я до сих пор больше читаю чем пишу)).
     
  21. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    @viktor72
    PHP:
    1. <?php
    2. // У тебя есть таблица status_vakans_has_vakans, в которой idstatus_vakans построчно имеет такие значения:
    3. $status_vakans_has_vakans = [
    4.     1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
    5.     1, 3, 5, 7, 9, 11,
    6.     1, 2, 3, 5, 7, 11, 13, 17,
    7.     1, 3, 5, 7, 11,
    8.     4, 6, 8, 8, 9, 10,
    9. ];
    10.  
    11. // В этот массив мы упакуем статистику вхождения значений idstatus_vakans
    12. $stats = [];
    13.  
    14. // А вот так у нас описываются статусы
    15. $statuses = [
    16.     1 => 'Один',
    17.     2 => 'Два',
    18.     3 => 'Три',
    19.     4 => 'Четыре',
    20.     5 => 'Пять',
    21.     6 => 'Шесть',
    22.     7 => 'Семь',
    23.     8 => 'Восемь',
    24.     9 => 'Девять',
    25.     10 => 'Десять',
    26.     11 => 'Одинадцать',
    27.     13 => 'Двенадцать-тринадцать',
    28.     17 => 'Тринадцать-семнадцать',
    29.     19 => 'Пятнадцать-девятнадцать-пусто'
    30. ];
    31.  
    32. // У меня тут нет реального обмена с СУБД, а нижеследующий код **немного** с ним связан
    33. if (0)
    34. {
    35.     // Вот такой будет запрос к СУБД
    36.     $sql = "SELECT `idstatus_vakans`, COUNT(*) `cnt` FROM `status_vakans_has_vakans` GROUP BY `idstatus_vakans`";
    37.  
    38.     // Вот сюда мы помещаем ресурс результата запроса к СУБД
    39.     $res = $mysqli->query($sql);
    40.  
    41.     /*
    42.       Результирующая таблица будет вот такая:
    43.  
    44.       idstatus_vakans | cnt
    45.       ----------------+----
    46.       1 |  4
    47.       2 |  2
    48.       3 |  4
    49.       4 |  2
    50.       5 |  4
    51.       6 |  2
    52.       7 |  4
    53.       8 |  3
    54.       9 |  3
    55.       10 |  2
    56.       11 |  4
    57.       13 |  1
    58.       17 |  1
    59.      */
    60.  
    61.     // Вот так мы построчно получаем записи из результирующей таблицы
    62.     while ($row = $res->fetch_assoc())
    63.     {
    64.         // И вот так мы складываем статистику в массив
    65.         $stats[$row['idstatus_vakans']] = $row['cnt'];
    66.     }
    67. }
    68. else
    69. {
    70.     // И теперь то же самое но без СУБД
    71.     $stats = array_count_values($status_vakans_has_vakans);
    72. }
    73.  
    74. // На выхлопе получаем:
    75. var_dump($stats);
    76. /*
    77.   array(13) {
    78.   [1] =>
    79.   int(4)
    80.   [2] =>
    81.   int(2)
    82.   [3] =>
    83.   int(4)
    84.   [4] =>
    85.   int(2)
    86.   [5] =>
    87.   int(4)
    88.   [6] =>
    89.   int(2)
    90.   [7] =>
    91.   int(4)
    92.   [8] =>
    93.   int(3)
    94.   [9] =>
    95.   int(3)
    96.   [10] =>
    97.   int(2)
    98.   [11] =>
    99.   int(4)
    100.   [13] =>
    101.   int(1)
    102.   [17] =>
    103.   int(1)
    104.   }
    105. */
    106.  
    107. // Осталось вывести эту порнографию в виде таблички
    108. ?><table>
    109.     <thead>
    110.         <tr>
    111.             <th>
    112.                 Статус (код)
    113.             </th>
    114.             <th>
    115.                 Кол-во
    116.             </th>
    117.         </tr>
    118.     </thead>
    119.     <tbody>
    120.         <?php
    121.         foreach ($statuses as $id => $title):
    122.             $cnt = isset($stats[$id]) ? $stats[$id] : '-';
    123.             ?>
    124.             <tr>
    125.                 <td>
    126.                     <?= htmlspecialchars($title) ?> (<?= $id ?>)
    127.                 </td>
    128.                 <td>
    129.                     <?= $cnt ?>
    130.                 </td>
    131.             </tr>
    132.         <?php endforeach; ?>
    133.     </tbody>
    134. </table>
    [​IMG]

    Как же мы с тобой хорошо потрудились. Теперь и отдохнуть можно. Заслужили.
     
    viktor72 и mahmuzar нравится это.
  22. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Ganzal
    ты думаешь я брошусь помогать? :D буду делать массаж сердца? :D я тебя лучше попрошу :D ты же опытней а я начинающий, или в лучшем случае в скорую позвоню либо людей на помощь позову, я же добрый на самом деле не кину в беде человека :). Если я не знаю как этот массаж сердца делать лучше не лезть не в свое дело и-бо хуже будет. А если даже хоть не много знал бы как его делать, то хоть бы не много, хоть как ни-будь или чем не-будь помог бы человеку.
    Вот так и в программировании, помогаю если хоть не много знаю.
    Лан давай без шуток, я же согласился что я не прав а ты опять за свое взялся убеждать меня, в том что я такой сякой и подсказки делаю не правильно, плюс в этом есть один, и он заключается в том, что кто-то лучше понимающий или знающий ответ поправит меня и объяснит что не так, а я себе это на ус наматаю и запомню чтобы в следующий раз не делать такой ошибки).
     
  23. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Красота! Спасибо!
    я пишу по старинке - $query = mysqli_query()... стиль которым вы пишите - $res = $mysqli->query($sql); мне не знаком. Мне надо переделывать ?

    почему порнография? в чём зло?
     
  24. viktor72

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

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    В ходе расследования у меня появилась боль.. вернее две
    img-2017-07-22-17-14-00.png

    Боль первая:
    вывести надо так:

    Статус вакансии | количество вакансий | Вакансий на сумму
    -----------------------------------------------------------------------------------------------
    Открытых --- | --- --------- 5 -------- | -------100 000
    В работе ----- | ---- ------- 10 --------- | ----- 250 000
    и т.д.
    То есть , надо вывести все 10 статусов, колличестов вакансий в каждом статусе и на какую сумму вакансий в каждом статусе.

    Боль вторая, главная.
    У одной vakans в конкретный момент времени только один status. Значит таблица посредник не нужна. Я её сделал чтоб туда даты вносить ..но позже создал специальнуютаблицу для дат..
    Вопрос - надо удалять лишнюю таблицу и переделывать все запросы или приспосабливаться к тому что есть?
    Важный момент - в течении жизни вакансия проходит все статусы и хочется зафиксировать каждую дату изменения статуса. Нету ли в апдейте каких то подводных камней?.....
    Погружаюсь в раздумья ...
    Если кто то может, подскажите
    Всем спасибо!
     
  25. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    @Ganzal
    если детям говорить "не умеешь - не берись" они вырастают трусливыми тупицами

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

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

    ты им говори, что поправить - так они будут учиться у твоего опыта
     
    viktor72 нравится это.