За последние 24 часа нас посетили 7609 программистов и 677 роботов. Сейчас ищут 228 программистов ...

Помогите разобраться с сессиями или куками.

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

  1. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.834
    Симпатии:
    946
    Утро раннее, ты еще не проснулся и не изнасиловал свою голову до состояния кастрюли. Давай вместе думать. Что нужно группировать и зачем? Что с чем нужно объединять и зачем?
     
  2. kvadim

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

    С нами с:
    1 сен 2015
    Сообщения:
    66
    Симпатии:
    0
    Ну смотря где утро ранее. у меня уже 11 часов, скоро скажем так обед. Ну, как мне тут советовали, чтобы посчитать количество голосов, для каждого учителя, надо использовать join и group by и вот ни как я это не понимаю, я по разному пробовал, дома. Но не показывает как надо совсем.
     
  3. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.834
    Симпатии:
    946
    Покажи как пробовал
     
  4. kvadim

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

    С нами с:
    1 сен 2015
    Сообщения:
    66
    Симпатии:
    0
    Вот сейчас попробовал такой вот запрос
    Код (Text):
    1. SELECT count(*), id, id_teacher, name_teachers, title_themes FROM `poll_ip`, `teachers` WHERE id=id_teacher group by data
    Ответ показал такой вот:
    Снимок.PNG
    Сейчас показывает, как мне кажется вроде бы как надо, только вот как значения которые считает функция count запихнуть в переменную и потом вывести на экран.
     
    #79 kvadim, 30 июн 2016
    Последнее редактирование: 30 июн 2016
  5. kvadim

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

    С нами с:
    1 сен 2015
    Сообщения:
    66
    Симпатии:
    0
    Как теперь этот запрос вывести в браузер?
    Код (Text):
    1. SELECT count(*), id, id_teacher, name_teachers, title_themes, id_type, ip_address FROM `poll_ip`, `teachers` WHERE id=id_teacher AND id_type=1 group by data order by data asc
     
  6. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.834
    Симпатии:
    946
    Ты очень упорно пропускаешь основы. Есть такое понятие как алиас. Синоним, псевдоним. Когда ты работаешь с агрегированным полем, или когда у тебя в разных таблицах есть поля с одинаковым значением, но разным назначением - не обойтись без алиасинга. Сделай SELECT COUNT(*) `cnt` ... и у тебя в результирующей таблице будет поле cnt.
     
  7. denis01

    denis01 Старожил
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.131
    Симпатии:
    1.678
    Адрес:
    Молдова, г.Кишинёв
    Вроде должно быть
    Код (Text):
    1. SELECT COUNT(*) AS `cnt`,
     
  8. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.834
    Симпатии:
    946
    @denis01 должно быть по SQL92, но mySQL и далее MariaDB вполне допускают пропуск ключевого слова AS. А дальше уже возникает такой элемент, как экономия трафика между приложением и СУБД. Если можно опустить, то почему бы и не сэкономить по 4 байта на каждом вхождении?
     
    denis01 нравится это.
  9. kvadim

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

    С нами с:
    1 сен 2015
    Сообщения:
    66
    Симпатии:
    0
    Все решилось таким вот кодом, может он и громоздкий, может где-то что-то и не по определенным технологиям, но вроде работает, все как надо. Это наверно главное, я думаю. :)
    PHP:
    1. <?php
    2.         $query = "SELECT * FROM `type_teacher`, `teachers` WHERE type_teacher.id=teachers.id_type AND teachers.id_type=1 ORDER BY `name_teachers` ASC";
    3.         if($result = mysqli_query($link, $query))
    4.         {
    5.             while($row = mysqli_fetch_assoc($result))
    6.             {
    7.                 $query_sql = "SELECT count(*) as count FROM `poll_ip` WHERE id_teacher=".$row["id"];
    8.                 $result_sql = mysqli_query($link, $query_sql);
    9.                 while($row_sql = mysqli_fetch_assoc($result_sql))
    10.                 {
    11.                     $query_diagrm = "SELECT count(*) as count FROM `poll_ip`";
    12.                     $result_diargam = mysqli_query($link, $query_diagrm);
    13.                
    14.                     while($row_diagram = mysqli_fetch_array($result_diargam))
    15.                     {
    16.                        
    17.                         $diagrm_all = 100 / $row_diagram['count'];
    18.                         $nbsp = "";
    19.                         for($i = 0; $i < ($diagrm_all * $row_sql['count']); $i++)
    20.                         {
    21.                             $nbsp = $nbsp."&nbsp;";
    22.                         }
    23.                         echo '<tr>
    24.                                <td>
    25.                                    <span class="teacher">'.$row["name_teachers"].'<span class="themes"> - "'.trim($row["title_themes"]).'"</span></span>
    26.                                    <span class="votes"><p>Количество голосов '.$row_sql['count'].' - ('.($diagrm_all * $row_sql['count']).'%)</p></span>
    27.  
    28.                                    <div width="'.($diagrm_all * $row_sql['count']).'%" style="background-color: red; display: inline-block; height: 5px;">'.$nbsp.'</div>
    29.                                </td>
    30.                            </tr>';
    31.                     }
    32.  
    33.                 }
    34.  
    35.             }
    36.         }
    37.         ?>
     
  10. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.834
    Симпатии:
    946
    Фу как это отвратительно. Убери немедленно и иди учи джойны и группировки. Ты не понимаешь что вот это твоё "я сделал" дает нагрузку на сервак. Вот у тебя есть 30 учителей. Будет 1 запрос на их список и еще 30 на их рейтинг. Итого 31. А можно решить за 1. Подчеркиваю, ЗА ОДИН запрос. Люблю приводить пример с десятком яиц. Попросила тебя мамка десяток яиц купить. Ты оделся, вышел на улицу, дошел до остановки, дождался маршрутки, доехал до АШАНа, нашел яйца, взял одно, дошел до кассы, оплатил, дождался маршрутку, доехал и дошел до дома, переоделся, положил яйцо в холодильник, переоделся, вышел на улицу... и так далее пока в холодильнике не будет 10 заветных яиц. А ведь можно весь десяток купить одной упаковкой. Сравни теперь затраты по времени. То же самое и в твоем решении задачи через подзапросы.
     
  11. kvadim

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

    С нами с:
    1 сен 2015
    Сообщения:
    66
    Симпатии:
    0
    Я не спорю, может так и правильнее, как Вы говорите, но я эти джойны и группировки не понимаю. Это пока для меня сложно, давольно. Если Вы можете объяснить это, так чтобы я понял, то я переделаю, но пока я это не понимаю. Сделал так как понял.
     
  12. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.834
    Симпатии:
    946
    У тебя есть таблица в которой каждый кортеж это голос за учителя. Уникальность голоса проверяется по паре дата-айпишник. Но сейчас не о них. Сейчас об учителе. Если сделать группировку по учителю, то можно использовать агрегатную функцию COUNT и посчитать кол-во сгруппированных строк. А по скольку мы группируем по учителю то фактически получаем кол-во голосов за этого учителя. И строк в результате будет столько, сколько уникальных учителей есть в таблице голосований. Это про группировку.

    Теперь про объединение. У тебя есть таблица учителей с первичным ключом - уникальным идентификатором учителя. И есть таблица голосования в которой голос за учителя определяется по его уникальному идентификатору. То есть, можно объединить таблицу учителей и таблицу голосования через уникальный идентификатор учителя.

    Ну и самое интересное это комбинирование группировки и объединения. Одним запросом ты можешь выбрать нужную тебе информацию по учителю - например, айдишник и фио, и тут же подцепить вторую таблицу, сделать по ней группировку и агрегатом посчитать кол-во сгруппированных строк. На выходе ты получаешь одну таблицу с полями айдишникУчителя+ФИОУчителя+КолвоГолосовЗаУчителя.

    Это одна из самых простых задач с группировкой и объединением. Думаю, можно даже примеры похожие найти и просто адаптировать их под свой случай.
     
  13. kvadim

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

    С нами с:
    1 сен 2015
    Сообщения:
    66
    Симпатии:
    0
    Я вот такие примеры не находил, все что мне попадалось, это по отдельности join и по отдельности group by а вот как они вместе сочитаются нигде не видел.
     
  14. denis01

    denis01 Старожил
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.131
    Симпатии:
    1.678
    Адрес:
    Молдова, г.Кишинёв
    В них должно быть объяснение, теория, основы, практика, причинно следственные связи. Чтобы ты смог написать запрос, которого нет в документации. Понимая принципы работы базы.
     
  15. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.834
    Симпатии:
    946
    @kvadim вместе они работают ровно так же легко как и по отдельности. Напиши сначала запрос с группировкой - вывод кол-ва строк с каждым из учителей. А потом например через джойн выведи дату последнего голоса. Давай, дерзай. Ждем от тебя два запроса по заданию.
     
  16. acanthis

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

    С нами с:
    16 май 2016
    Сообщения:
    6
    Симпатии:
    1
    а если несколько человек сидят под одним айпишником? Что будешь делать? )
     
  17. kvadim

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

    С нами с:
    1 сен 2015
    Сообщения:
    66
    Симпатии:
    0
    Ну и пускай сидят, голосование только раз в сутки с одного айпишника. Больше и не надо.
     
  18. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    9.401
    Симпатии:
    735
    Адрес:
    из России с любовью
    ерунда это будет, а не голосование. у нашего домашнего интернет-провайдера, например, тысяч 50 квартир и очень небольшой пул внешних адресов.

    чем более локальным будет твой сайт, тем больше лучей ненависти ты заработаешь.
    а если не учтешь, что бывают еще браузерные "оптимизаторы трафика", которые работают как прокси, можешь получить до 30% одинаковых адресов вообще.
     
  19. kvadim

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

    С нами с:
    1 сен 2015
    Сообщения:
    66
    Симпатии:
    0
    С группировкой какая-то белеберда получается, выдает не то что нужно, ну не понимаю я это...и все....хрень какая-то эта группировка вместе джойном...:(....У меня вышло такая вот ерунда
    Код (Text):
    1. SELECT count(*) AS count, name_teachers, title_themes FROM `poll_ip`, `teachers` GROUP BY name_teachers
    С таким запросом выдает у всех 30 учителей одинаковое количество 34, это 34 голоса было. Еще попробовал сделать так
    Код (Text):
    1. SELECT count(*) AS count, name_teachers, title_themes FROM `poll_ip` inner join teachers on poll_ip.id_teacher = teachers.id GROUP BY name_teachers
    Так выдает только тех за кого проголосовали, правда количество голосов у всех разный, а за кого не проголосовали не показывает, а так не должно быть. А вот так выдает все тоже самое, только сортирует по дате
    Код (Text):
    1. SELECT count(*) AS count, name_teachers, title_themes, data FROM `poll_ip` inner join teachers on poll_ip.id_teacher = teachers.id GROUP BY name_teachers ORDER BY data DESC
     
  20. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.834
    Симпатии:
    946
    Мдя... Бяда...

    Первый способ называется умножением таблиц. Для каждой строки первой таблицы будет подставлена каждая строка второй таблицы. Потом ты схлопнешь джойном и получишь одинаковые суммы. Всё работает как и должно.

    Второй способ, равно как и третий, используют тип объединения, при котором не допускается отсутствие кортежей в связанной таблице. Поэтому у тебя в результирующей таблице нет учителей, за которых нет голосов. Все работает как и должно.
     
  21. kvadim

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

    С нами с:
    1 сен 2015
    Сообщения:
    66
    Симпатии:
    0
    Спасибо, за подсказки, но все равно это не то, что надо. Может так и должно быть по Вашему, но меня такой результат не устраивает. Так не должно быть! Надо, чтобы не только отображались голоса за которых проголосовали, но и те за которых не голосовали. А так выходит однобокая картина. Так как я сделал, показывает, так как надо.
     
  22. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.834
    Симпатии:
    946
    Не-не-не. Оно не по моему так. Оно ТАК работает потому что ТЫ ТАК написал. И оно работает ПРАВИЛЬНО. Но... Если тебя не устраивает результат - ПЕРЕПИШИ.
    Задача реально тривиальная. Ты слишком много сил на неё тратишь. Может уже стоит забыть про программирование? Ну не твоё это, видимо.
     
  23. kvadim

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

    С нами с:
    1 сен 2015
    Сообщения:
    66
    Симпатии:
    0
    Если у Вас больше опыта, а у меня меньше, то это не значит, что мне надо все бросать и забывать. Просто учителей реально практикующих и нормально объясняющих мне не встречалось, все как-то сам. По чуть-чуть. И еще если сейчас у меня все работает, так как мне надо, то зачем переписывать? Главное результат, а по какой технологии это не важно. Я так думаю. Я могу конечно и ошибаться. Но пока все работает, так как надо. Голоса по каждому показывает, даже еще и процентное соотношение. И еще раз повторюсь, если Вы лучше понимаете это дело, так объясните, так чтобы было понятно, тем у кого опыта мало.
     
  24. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.834
    Симпатии:
    946
    Для решения твоей задачи одним запросом нужно просто еще разок внимательно прочитать про объединения.
     
  25. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    9.401
    Симпатии:
    735
    Адрес:
    из России с любовью
    читай про разницу между inner join и outer (left|right) join.
    ты объединяешь учителей с голосованием как inner join. результат включает только те записи, для которых есть соответствие в обеих таблицах! то есть никаких "пустых" голосований ты здесь не получишь. вот так оно работает, просто запомни.

    тебе поможет внешнее соединение. гугли "mysql внешнее соединение"