Ниже — две простые задачки по SQL/БД и одна по php. Упор в них должен был быть сделан на изящность и краткость решения (чего я не сделал в ходе интервью).

/**/

Задача по БД №1

Есть две таблицы t1 и t2.

t1.id: 1,2,3,4,5,6,7,8,9
t2.id: 1,3,5,7,9

Написать mysql запрос, который выберет идентификаторы из t1, которых нет в t2.

Для нашего примера это: 2, 4, 6, 8

Мое решение №1

SELECT t1.id
FROM t1
JOIN t2 ON t1.id <> t2.id

(минус) так не сработает: будет декартово произведение:

1,1,1,1,2,2,2,2,2,3,3,3,3,4,4,4,4,4,5,5,5,5,6,6,6,6,6,7,7,7,7,8,8,8,8,8,9,9,9,9

Мое решение №2

SELECT id
FROM t1
WHERE id NOT IN (
  SELECT id 
  FROM t2
)

(плюс) так сработает , но не идеально (хотя нейронка также посоветовала)

Этот запрос выполнит подзапрос к таблице t2, чтобы получить список всех id которые в ней есть.

Затем с помощью NOT IN выберет только те id из t1, которых нет в результате подзапроса к t2.

Мое решение №3

SELECT t1.id
FROM t1
LEFT JOIN t2 ON t1.id = t2.id
WHERE t2.id IS NULL

(плюс) самое правильное решение


Задача по БД №2

Есть таблица

CREATE TABLE Table1 (
  date DATETIME NOT NULL,
  col1 INT NOT NULL,
  KEY (date)
) ENGINE=Innodb;

Есть запрос

SELECT *
FROM Table1
WHERE YEAR(date) = 2017;

Как можно ускорить запрос? Объясните ответ

(плюс) Ответ:

Тут будут вычисления YEAR() над каждой строчкой, надо от этого избавиться

Чтобы ускорить этот запрос, можно создать дополнительный индекс:

sqlCopy codeCREATE INDEX idx_year ON Table1 (YEAR(date));

А затем в запросе использовать выражение, соответствующее индексу:

sqlCopy codeSELECT *
FROM Table1
WHERE YEAR(date) = 2017;

При этом запрос сможет использовать индекс idx_year для быстрого поиска по году.

Без индекса для каждой строки таблицы запрос должен вычислять YEAR(date), что медленно и не оптимально.

А индекс позволяет хранить год в готовом виде и значительно ускорить поиск. Так как годов намного меньше, чем отдельных дат.

Поэтому создание индекса по выражению, которое используется в условии WHERE, позволяет оптимизировать производительность запроса.

(плюс) Второе правильное решение (подсказал интервьювер):

Использовать диапазон дат:

WHERE DATE BETWEEN ....


Задача по PHP

Есть массив с разнородными данными Требуется найти сумму только цело-численных элементов массива с помощью встроенных функций по работе с массивами:

[1,2,3, null, 2.5, 'test', '10a10', new DateTime()]

(минус) Не правильно: пройтись по массиву в цикле и сравнивать тип элемента с int (есть решение короче, ниже)

(плюс) Решение (правильно):

array_sum(array_filter($a, "is_integer"))

(звезда) или is_numeric для проcто численных (тогда float приведется к int)

Полное решение: [ см. 3v4l ]

<?php

function arraySum($arr): int {
    return array_sum(array_filter($arr, "is_integer"));    
} 

$arr = [1, 2, 3, null, 3.5, 'test', '10a10', new DateTime()];
$sum = arraySum($arr);

echo $sum;

Tags

Нет Ответов

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Рубрики


Подпишись на новости
👋

Есть вопросы?