Step 1
-------
array_intersect_key($array, array_flip(array_keys(array_unique(array_column($array, 'id')))))
array(4) {
  [0]=>
  array(3) {
    ["id"]=>
    int(1)
    ["date"]=>
    string(10) "12.01.2020"
    ["name"]=>
    string(5) "test1"
  }
  [1]=>
  array(3) {
    ["id"]=>
    int(2)
    ["date"]=>
    string(10) "02.05.2020"
    ["name"]=>
    string(5) "test2"
  }
  [2]=>
  array(3) {
    ["id"]=>
    int(4)
    ["date"]=>
    string(10) "08.03.2020"
    ["name"]=>
    string(5) "test4"
  }
  [5]=>
  array(3) {
    ["id"]=>
    int(3)
    ["date"]=>
    string(10) "06.06.2020"
    ["name"]=>
    string(5) "test3"
  }
}

Step 2
-------
$temp = $array;
sort($temp, SORT_STRING);
array_multisort(array_column($array, 'date'), SORT_ASC, $temp);
array(6) {
  [0]=>
  array(3) {
    ["id"]=>
    int(2)
    ["date"]=>
    string(10) "02.05.2020"
    ["name"]=>
    string(5) "test2"
  }
  [1]=>
  array(3) {
    ["id"]=>
    int(3)
    ["date"]=>
    string(10) "06.06.2020"
    ["name"]=>
    string(5) "test3"
  }
  [2]=>
  array(3) {
    ["id"]=>
    int(4)
    ["date"]=>
    string(10) "08.03.2020"
    ["name"]=>
    string(5) "test4"
  }
  [3]=>
  array(3) {
    ["id"]=>
    int(2)
    ["date"]=>
    string(10) "11.11.2020"
    ["name"]=>
    string(5) "test4"
  }
  [4]=>
  array(3) {
    ["id"]=>
    int(1)
    ["date"]=>
    string(10) "12.01.2020"
    ["name"]=>
    string(5) "test1"
  }
  [5]=>
  array(3) {
    ["id"]=>
    int(1)
    ["date"]=>
    string(10) "22.01.2020"
    ["name"]=>
    string(5) "test1"
  }
}

Step 3
-------
Searching id = 2
array_intersect_key($array, array_flip(array_keys(array_column($array, 'id'), 2)))
array(2) {
  [1]=>
  array(3) {
    ["id"]=>
    int(2)
    ["date"]=>
    string(10) "02.05.2020"
    ["name"]=>
    string(5) "test2"
  }
  [4]=>
  array(3) {
    ["id"]=>
    int(2)
    ["date"]=>
    string(10) "11.11.2020"
    ["name"]=>
    string(5) "test4"
  }
}

Step 4
-------
array_column(array_intersect_key($array, array_flip(array_keys(array_unique(array_column($array, 'id'))))), 'id', 'name')
array(4) {
  ["test1"]=>
  int(1)
  ["test2"]=>
  int(2)
  ["test4"]=>
  int(4)
  ["test3"]=>
  int(3)
}

Step 5
-------
  1. Считаем количество тэгов
  2. Выбираем из связывающей таблицы товары с таким числом записей
  3. Выбираем эти товары
  4. Выбираем из результата id и name

SELECT g.id as id, g.name as name FROM (SELECT g.id, g.name, gt.tag_id, gt.goods_id FROM goods g, goods_tags gt, (SELECT count(gt.tag_id) FROM gt WHERE gt.goods_id = g.id) as gt_count, (SELECT count(*) FROM tags) as tags_count WHERE g.id = gt.goods_id AND (SELECT count(gt.tag_id) FROM gt WHERE gt.goods_id = g.id) = (SELECT count(*) FROM tags));

Step 6
-------

SELECT DISTINCT department_id FROM evaluations WHERE gender = true AND value > 5;