Ниже — две простые задачки по 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;
Нет Ответов