За последние 24 часа нас посетили 22367 программистов и 1044 робота. Сейчас ищут 728 программистов ...

Вывод пустых и не пустых связей.

Тема в разделе "MySQL", создана пользователем myks92, 23 авг 2019.

  1. myks92

    myks92 Новичок

    С нами с:
    12 июн 2018
    Сообщения:
    45
    Симпатии:
    1
    Всем привет. Немного странный вопрос, но не знаю как сделать(

    Есть таблица
    certifications
    - id
    - name

    Есть таблица
    appointments
    - id
    - certification_id

    Мне нужно посчитать количество назначений по аттестации одним запросом.

    Чтобы это было, например, (count(appointment.certification_id)) as app_count

    Таким способом почему-то выводит только не пустые. Там где есть связь
     
    #1 myks92, 23 авг 2019
    Последнее редактирование: 23 авг 2019
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    а какой смысл в тех записях, у которых нет связей?
     
  3. kazadai90

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

    С нами с:
    6 фев 2013
    Сообщения:
    103
    Симпатии:
    19
    Код (Text):
    1. select count(id) from appointments group by certification_id
    такое подойдет?
     
  4. myks92

    myks92 Новичок

    С нами с:
    12 июн 2018
    Сообщения:
    45
    Симпатии:
    1
    Смысл такой, что мне нужно вывести список, у кого сколько назначений. Если у человека нет назначений, то его предлагать в первую очередь.
    --- Добавлено ---
    Группировка по связи. Нет нулевых связей. Нужно null тоже учитывать.
     
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Из одной таблицы назначений вы никак не выудите отсутствие назначений у человека ;)
     
  6. kazadai90

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

    С нами с:
    6 фев 2013
    Сообщения:
    103
    Симпатии:
    19
    Ну тогда так попробуйте

    Код (Text):
    1.  
    2. select certifications.id, count(appointments.id)
    3. from certifications
    4. left join appointments on certifications.id = appointments.certification_id
    5. group by certifications.id
    6. order by count(appointments.id)  desc
     
  7. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    @kazadai90, count будет null'ы подсчитывать, т.е. нулевые количества так не получишь.
    --- Добавлено ---
    Можно присоединять «таблицу количеств», полученную вложенным запросом на таблице назначений, а потом исправлять null'ы:
    Код (Text):
    1. IFNULL(`count`,0) `count`
     
  8. kazadai90

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

    С нами с:
    6 фев 2013
    Сообщения:
    103
    Симпатии:
    19
    Код (Text):
    1. create table certifications(
    2.     id int(11) primary key auto_increment,
    3.     name text
    4. );
    5.  
    6. insert into certifications(name) values('php5'),('php7'),('mysql'),('git');
    7.  
    8. create table appointments(
    9.     id int(11) primary key auto_increment,
    10.     certification_id integer
    11. );
    12.  
    13. insert into appointments(certification_id) values(2),(2),(3),(3),(3),(3);
    Код (Text):
    1. select certifications.id, count(appointments.id)
    2. from certifications
    3. left join appointments on certifications.id = appointments.certification_id
    4. group by certifications.id
    5. order by count(appointments.id)  desc
     

    Вложения:

    • 1.png
      1.png
      Размер файла:
      31,5 КБ
      Просмотров:
      6
    • 2.png
      2.png
      Размер файла:
      26 КБ
      Просмотров:
      5
    • 3.png
      3.png
      Размер файла:
      19,2 КБ
      Просмотров:
      6
    miketomlin нравится это.
  9. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Да, точно. Ты же не все подряд строки подсчитываешь, а с норм. appointments.id. Сорри за доставленные труды :)
     
  10. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    @myks92, можно кэшировать количества в первой таблице и не париться с изобретением/выполнением сложного запроса ;)
    --- Добавлено ---
    Про триггеры MySQL почитай.
     
  11. myks92

    myks92 Новичок

    С нами с:
    12 июн 2018
    Сообщения:
    45
    Симпатии:
    1

    Вот скорее всего так и придётся идти делать)) думал обойти систему ‍♂️