Как распечатать таблицу MySQL, которая подсчитывает количество дисков на три верхних драйвера?

Это называется функцией стрелки, частью спецификации ECMAScript 2015 spec ...

var foo = ['a', 'ab', 'abc'];

var bar = foo.map(f => f.length);

console.log(bar); // 1,2,3

Более короткий синтаксис, чем предыдущий:

// < ES6:
var foo = ['a', 'ab', 'abc'];

var bar = foo.map(function (f) {
  return f.length;
});
console.log(bar); // 1,2,3

DEMO

Другая удивительная вещь - лексическая this ... Обычно вы делаете что-то вроде:

function Foo() {
    this.name = name;
    this.count = 0;
    this.startCounting();
}

Foo.prototype.startCounting = function() {
  var self = this;
  setInterval(function () {
    // this is the Window, not Foo {}, as you might expect
    console.log(this); // [object Window]
    // that's why we reassign this to self before setInterval()
    console.log(self.count);
    self.count++;
  },1000)
}

new Foo();

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

function Foo() {
    this.name = name;
    this.count = 0;
    this.startCounting();
}

Foo.prototype.startCounting = function() {
  setInterval(() => {        
    console.log(this); // [object Object]
    console.log(this.count); // 1, 2, 3
    this.count++;
  },1000)
}

new Foo();

DEMO

MDN Подробнее о синтаксисе

Для получения более здесь довольно хороший ответ для , когда использовать функции стрелок.

0
задан JackBulldog 1 April 2019 в 05:13
поделиться

1 ответ

Проблема с вашим опубликованным запросом заключается в том, что вы не группируете подзапрос. В результате подразумевается группа по всему набору записей и возвращается неопределенное значение для идентификатора драйвера. Это, в свою очередь, означает, что внешний запрос найдет только driver_id неопределенного значения, возвращенного подзапросом.

Дано

drop table if exists t;
create table t
(drive_id int, driver_id int, date_time date, start_state varchar(1), end_state varchar(1));

insert into t values
(1,1,'2019-03-31','a','b'),
(1,1,'2019-03-31','a','b'),
(1,1,'2019-03-31','b','c'),
(1,2,'2019-03-31','a','b'),
(1,2,'2019-03-31','a','b'),
(1,3,'2019-03-31','a','b'),
(1,3,'2019-03-31','a','b'),
(1,4,'2019-03-31','a','b');

Подзапрос

SELECT
    COUNT(*) AS drive_counts,
    driver_id
FROM t
ORDER BY drive_counts DESC
LIMIT 3 

Возвращает

+--------------+-----------+
| drive_counts | driver_id |
+--------------+-----------+
|            8 |         1 |
+--------------+-----------+
1 row in set (0.00 sec)

Исправление подзапроса для группировки по идентификатору драйвера (и выгрузка неприятного с помощью предложение в пользу объединения)

SELECT
    start_state,
    end_state,
    t.driver_id,
    COUNT(*) AS n_drives
FROM t
JOIN (
    SELECT
        COUNT(*) AS drive_counts,
        driver_id
    FROM t
    group by driver_id
    ORDER BY drive_counts DESC
    LIMIT 3
) AS top_three_drivers on top_three_drivers.driver_id = t.driver_id
GROUP BY start_state, end_state, t.driver_id
order by t.driver_id,start_state;

Результаты в

+-------------+-----------+-----------+----------+
| start_state | end_state | driver_id | n_drives |
+-------------+-----------+-----------+----------+
| a           | b         |         1 |        2 |
| b           | c         |         1 |        1 |
| a           | b         |         2 |        2 |
| a           | b         |         3 |        2 |
+-------------+-----------+-----------+----------+
4 rows in set (0.00 sec)

Что я и ожидал. Кстати, вопрос плохой, поскольку он не учитывает ничьи - в этом примере драйверы 2 и 3 имеют одинаковое количество дисков, поэтому, возможно, драйвер 4 также должен появиться.

0
ответ дан P.Salmon 1 April 2019 в 05:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: