Как окрасить мои шаблоны результата vimgrep

1113 Это действительно ожидается. Вышеупомянутый запрос объединяет 4 таблицы:

  • order_status
  • болезнь
  • работники
  • приказы

"[ 1127] работники «таблица имеет отношение 1: N к« order_status ».

Также « работники » имеют отношение 1: N к болезни, на самом деле это не имеет значения, даже если это 1: 1 . [ 1115]

Запрос создает декартово произведение между вышеуказанными таблицами и дубликатов значений столбцов из каждой таблицы может быть в наборе результатов запроса выше.

Удалите group by и sum, чтобы увидеть набор результатов.

Например, в вашем примере для id_worker 25 у вас есть 3 строки order_status, соединенные с 1 строкой болезни (значения этой строки будут продублированы 3 раза), объединенные с 1 строкой рабочих (снова они будут продублированы 3 раза), с 1 заказами строка (такая же).

Таким образом, агрегатная функция sum объединяет повторяющиеся значения.

Это работало бы, только если результирующий набор содержал уникальные строки для всех столбцов, используемых для агрегатных функций

Чтобы решить эту проблему, используйте подзапросы для агрегирования результатов:

SELECT workers.fname, 
       workers.lname, 
       order_statusAgg.number_order,
       workers.id_worker,
       order_statusAgg.desc_order, 
       SEC_TO_TIME(SUM(order_statusAgg.stime)) AS 'TOTAL TIME', 
       SEC_TO_TIME(SUM(sicknessAgg.stime)) AS 'SICKNESS TIME' 
FROM   workers 
INNER JOIN (
SELECT sickness.id_worker, SUM((Time_to_sec(sickness.end_date) - 
                       Time_to_sec(sickness.begin_date))) AS stime
FROM sickness
GROUP BY sickness.id_worker
) sicknessAgg
               ON sicknessAgg.id_worker = workers.id_worker
       INNER JOIN (
SELECT order_status.id_worker, orders.number_order, orders.desc_order, SUM((Time_to_sec(order_status.end_date) - 
                       Time_to_sec(order_status.begin_date))) AS stime
FROM order_status
           INNER JOIN orders 
               ON orders.id_order = order_status.id_order
GROUP BY order_status.id_worker
) order_statusAgg
               ON workers.id_worker = order_statusAgg.id_worker 

WHERE  order_statusAgg.number_order LIKE 'TEST'
GROUP BY workers.id_worker

Обратите внимание, что в этом случае необходимо начинать с таблицы worker , так как вы хотите агрегировать различное количество строк из таблиц order_status и sickness.

Ссылки:

Как объединить три таблицы, чтобы получить Sum

MySQL JOIN с несколькими таблицами и SUMS

Как получить сумму двух таблиц, используя внутреннее объединение

8
задан Keith Pinson 24 January 2013 в 20:55
поделиться

4 ответа

Если Вы ищете шаблон после того, как Вы будете иметь: vimgrep'd это, Vim выделит его. Просто отредактируйте :vimgrep pattern files в :g/pattern/.

Для более богатого решения попробуйте этот сценарий.

4
ответ дан 5 December 2019 в 22:20
поделиться

Можно использовать Unix grep:

:!grep --color pattern %

Могут быть другие решения с помощью внутреннего grep/vimgrep, но этих работ для меня.

2
ответ дан 5 December 2019 в 22:20
поделиться

Возможно, ack соответствует Вашему счету?

0
ответ дан 5 December 2019 в 22:20
поделиться

Два пути:

  • Для нормального поиска / можно использовать :set hls.
  • Или можно использовать :match Search /pattern/. Это выделит все, что соответствует pattern.
0
ответ дан 5 December 2019 в 22:20
поделиться
Другие вопросы по тегам:

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