Ответы пользователя по тегу SQL
  • Как составить MySQL запрос с двух таблиц?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    JOIN по общему полю
    Ответ написан
    Комментировать
  • Как составить SQl запрос?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Удалите из таблицы поле `id` и сделайте первичным ключом пару (`cat_id`, `restaurant_id`), ведь дублей таких пар быть не должно. Тогда запрос можно будет упростить
    SELECT `restaurant_id`
      FROM `restaurants_category`
      WHERE `cat_id` IN (1, 2)
      GROUP BY `restaurant_id`
      HAVING COUNT(*) = 2
    Ответ написан
    3 комментария
  • Можно ли сделать SQL такого вида?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    SELECT `i`.`*`
      FROM `items` AS `i`
      JOIN `items_tags` AS `it` ON `it`.`item_id` = `i`.`id`
      JOIN `tags` AS `t1` ON `t1`.`id` = `it`.`item_id` 
        AND `t1`.`category_id` = 'Цвет'
        AND `t1`.`value` IN ('Синий', 'Красный')
      JOIN `tags` AS `t2` ON `t2`.`id` = `it`.`item_id` 
        AND `t2`.`category_id` = 'Длина'
        AND `t2`.`value` IN ('Длинный')
    Ответ написан
    1 комментарий
  • Как выбрать дни рождения?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    А нюансов и будет куча. Если, например, сегодня у семи человек дни рождения, какие из них должны попасть в выборку? А если это всё не учитывать, то несложно
    (SELECT *
      FROM `birthday`
      WHERE MONTH(`date`) > MONTH(CURDATE())
        OR (MONTH(`date`) = MONTH(CURDATE()) 
          AND DAYOFMONTH(`date`) = DAYOFMONTH(CURDATE()))
      ORDER BY MONTH(`date`), DAYOFMONTH(`date`)
      LIMIT 3)
    UNION (SELECT *
      FROM `birthday`
      WHERE MONTH(`date`) = MONTH(CURDATE()) 
          AND DAYOFMONTH(`date`) = DAYOFMONTH(CURDATE()))
    UNION (SELECT *
      FROM `birthday`
      WHERE MONTH(`date`) < MONTH(CURDATE())
        OR (MONTH(`date`) = MONTH(CURDATE()) 
          AND DAYOFMONTH(`date`) < DAYOFMONTH(CURDATE()))
      ORDER BY MONTH(`date`) DESC, DAYOFMONTH(`date`) DESC
      LIMIT 3)
    Ответ написан
    8 комментариев
  • Как правильно создать внешний ключ?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Добавить в таблицу `card_patient`:
    FOREIGN KEY (`patient`)
      REFERENCES `patient` (`id_patient`)
      ON DELETE CASCADE
      ON UPDATE CASCADE

    Только учтите, никакой автоматической связи таблиц при SELECT'е не появится, просто MySQL не даст добавить в поле `card_patient`.`patient` значение, отсутствующее в поле `patient`.`id_patient`.
    Ну и, в зависимости от настроек ON DELETE и ON UPDATE можно автоматически удалять и менять `card_patient`.`patient` при удалении/изменении `patient`.`id_patient` или блокировать такое удаление/изменение при существующей связи.
    Ответ написан
    1 комментарий
  • Есть ли разница между такими SQL запросами?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    EXPLAIN вам в помощь
    Ответ написан
    1 комментарий
  • Как удалить запись после ее обновления?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Таблицу нельзя изменять из триггеров этой же таблицы. Можете попробовать повесить триггер AFTER INSERT на ту таблицу, куда записываются данные и удалять строки временной таблицы оттуда, но это сработает только если есть возможность по вставляемым в постоянную таблицу данным определить удаляемую из временной таблицы строку.
    Ответ написан
    Комментировать
  • Как работают агрегатные функции?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В стандарте при использовании агрегатных функций каждое поле выборки, ORDER BY и HAVING должно быть либо результатом агрегатной функции, либо входить в GROUP BY. Таким образом приведённый вами запрос в стандарте недопустим.
    MySQL, до последней версии, допускал нестандартное использование агрегирования, выбирая для неагрегированых полей первое попавшееся значение. Начиная с версии 5.7 MySQL начал требовать соблюдения стандарта, и приведённый вами запрос выдаст ошибку. Вернуться к старым настройкам можно отключив режим ONLY_FULL_GROUP_BY в настройках или явно используя агрегатную функцию ANY_VALUE() на полях, которые раньше не агрегировались. Ваш запрос в этом случае будет выглядеть как
    SELECT ANY_VALUE(`id`), ANY_VALUE(`name`), ANY_VALUE(`age`), COUNT(*) 
      FROM `student`;

    Поскольку в запросе не указано, по каким полям проводить группировку, MySQL группирует все строки в одну. Если использовать GROUP BY <список полей>, то будут группироваться строки с одинаковыми значениями указанных в списке полей. Так запрос
    SELECT `age`, COUNT(*) 
      FROM `student`
      GROUP BY `age`;

    выдаст
    +------+----------+
    | age  | COUNT(*) |
    +------+----------+
    |  18  |    2     |
    |  17  |    1     |
    | NULL |    1     |
    +------+----------+
    Ответ написан
    Комментировать
  • Как найти два элемента с максимальным количеством общих связей?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    SELECT `t1`.`name`, `t2`.`name`, COUNT(*) AS `count`
      FROM `teacher` AS `t1`
      JOIN (
        SELECT DISTINCT `teacher_id`, `student_id`
          FROM `teacher_student` 
      ) AS `s1` ON `s`.`teacher_id` = `t1`.`id`
      JOIN (
        SELECT DISTINCT `teacher_id`, `student_id`
          FROM `teacher_student` 
      ) AS `s2` ON `s2`.`student_id` = `s1`.`student_id` AND `s2`.`teacher_id` > `s1`.`teacher_id`
      JOIN `teacher` AS `t2` ON `t2`.`id` = `s2`.`teacher_id`
      GROUP BY `t1`.`id`, `t2`.`id`
      ORDER BY `count`
      LIMIT 1
    Ответ написан
  • Как сравнить две огромные таблицы (3 и 2 млн строк) и обновить одну из них?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Нужен UNIQUE KEY (`id`, `id_shop`)
    Запрос будет примерно такой:
    INSERT INTO `items` (`id`, `id_shop`, `name`, `description`, ...)
      SELECT `id`, `id_shop`, `name` AS `new_name`, `description` AS `new_description`, ...
        FROM `new_items` 
      ON DUPLICATE KEY UPDATE `name` = `new_name`, `description` = `new_description`, ...

    Перед таким большим запросом есть смысл удалить остальные ключи, оставить только PRIMARY KEY и UNIQUE KEY, после запроса пересоздать их.
    Ответ написан
  • Как лучше спроектировать таблицу?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Зависит от типа учёта в магазине. Если учитывается каждый экземпляр оборудования, то и отдельную строку придётся заводить для каждого экземпляра. Если же учёт идёт обобщённый, то достаточно общего количества и количества в аренде. Дополнительно можно завести таблицу с записями о выдаче и возврате оборудования и счётчик арендованного менять триггером AFTER INSERT.
    Ответ написан
    Комментировать
  • Как избежать перезаписи данных в колонке LEFT OUTER JOIN?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    ON p.lastname = pai.lastname
    Имена колонок одинаковые, соответственно возвращается только одна колонка. Так что либо переименовывайте колонку в одной из таблиц, либо перечисляйте нужные поля в SELECT.
    Ответ написан
    Комментировать
  • Как объединить 2 таблицы так чтобы одна перекрыла часть другой?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    LEFT JOIN + IFNULL
    Ответ написан
    Комментировать
  • Как исправить неверный подсчет строк в MySQL?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    UNION по умолчанию выполняется как DISTINCT, то есть в результирующей таблице будут только уникальные строки, вместо трёх двоек будет включена только одна. Замените UNION на UNION ALL.
    Ответ написан
    Комментировать
  • Как сделать поиск MySQL в таблице по параметру?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Ответ написан
    Комментировать
  • Возможно ли получить результат коллекцией Mysql?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Нет. MySQL возвращает результат только в виде плоских таблиц.
    Ответ написан
    Комментировать
  • 'SELECT' как использовать результат запроса в if?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    RTFM
    Поведение функции mysqli_num_rows() зависит от того, используется ли буферизованная или не буферизованная результирующая выборка. Для не буферизованной выборки mysqli_num_rows() не вернет правильное число рядов пока все ряды не будут получены и обработаны.
    Ответ написан
    Комментировать
  • Где ошибка в SQL-запросе?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Не используйте прямую подстановку переменных в запрос. Вместо этого воспользуйтесь плейсхолдерами.
    $stmt = mysqli_prepare($connect, "INSERT INTO *** (fio,email,age,anw1,anw2,frequency) VALUES (?, ?, ?, ?, ?, ?)");
    mysqli_stmt_bind_param($stmt, "ssssss", $fio, $email, $age, $anw1, $anw2, $frequency);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_close($stmt);
    Ответ написан
    Комментировать
  • Проблемы с sql_mode=ONLY_FULL_GROUP_BY?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В режиме ONLY_FULL_GROUP_BY все получаемые в запросе данные должны быть в агрегатных функциях (SUM, COUNT, MAX, и т.д.) или по ним должна проводиться группировка. В вашем запросе `idate` не входит ни туда, ни туда, поэтому MySQL в строгом режиме не знает, из какой именно строки таблицы взять значение.
    Либо убирайте колонку `idate` из запроса, либо включайте её в агрегатную функцию.
    Можете отключить ONLY_FULL_GROUP_BY, тогда `idate` будет браться, как правило, из первой строки, попавшей в группировку.
    Ответ написан
  • Как построить запрос sql?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Выбираете максимальные id с группировкой по uid и джойните к этой выборке таблицу по id
    Ответ написан
    Комментировать