Сложный порядок / группировка по / количеству

#mysql #sql

#mysql #sql

Вопрос:

У меня есть 3 простых таблицы, но мой запрос сложный

Таблица продавцов :

 seller_id | name
1           john
2           paul
5           fred
6           robert
etc ...
  

Таблица транзакций (на данный момент только 3 значения) :

 trans_id | name
1          BUY
2          SELL
3          EXCHANGE
  

Таблица операций :

 seller_id | trans_id | datetime
2           1          ....
2           2          ....
6           1          ....
2           3          ....
6           1          ....
  

В этих таблицах записываются все транзакции продавцов и их момент.

Я хотел бы получить, в последний день или через интервал времени

  • имя продавца, номер заказа на покупку-транзакцию по количеству транзакций на покупку в интервале
  • имя продавца, номер заказа на покупку или продажу по номеру транзакции на покупку или продажу в интервале

Я пробовал много вещей, странные вещи, которые не нравятся mysql, но у меня не получается … спасибо!

Комментарии:

1. Вы хотите подсчитать для каждого продавца, поэтому ваш запрос должен GROUP BY seller_id . И, конечно, вы бы ограничили тип транзакции в WHERE предложении. Вы зашли так далеко? Где именно вы застряли?

2. Вы пробовали много вещей . Хотите показать, что вы пробовали, но не сработало?

3. Я не уверен, понимаю ли я, что вы ищете, но разве это не что-то подобное? SELECT S.NAME, COUNT(O.TRANS_ID) FROM OPERATIONS O JOIN SELLERS S ON O.SELLER_ID = S.SELLER_ID WHERE O.DATETIME BETWEEN <DATE1> AND <DATE2> GROUP BY S.NAME ORDER BY 2

4. Когда вы говорите «имя продавца, номер заказа на покупку-транзакцию по количеству транзакций покупки в интервале», вы имеете в виду, что во 2-м столбце должно быть общее количество транзакций покупки» для этого продавца, независимо от интервала? (в принципе, учитывается ли интервал только в order by , или для count() столбца тоже?

5. Ядро что-то вроде elect sellers.name, count(sellers.trans_id) from operations join sellers on sellers.seller_id = transactions.seller_id join transactions on transactions.trans_id = operations.trans_id where transactions.name in ("BUY", "SELL") group by ... order by count(sellers.trans_id) , но все, что я добавляю, не принимается

Ответ №1:

Вот решение для вашего первого запроса, т.Е. «имя продавца, номер заказа на покупку-транзакцию по количеству транзакций на покупку в интервале» :

 SELECT 
     S.name,
     COUNT(1) AS total
FROM operations O
JOIN sellers S on O.seller_id = S.seller_id
JOIN transactions T on O.trans_id = T.trans_id
WHERE O.datetime >= CURDATE() AND T.name = 'BUY'
GROUP BY S.name
ORDER BY total
  

Очевидно, что второй запрос почти такой же, предложение where просто немного меняется, см. Следующее :

 SELECT 
     S.name,
     COUNT(1) AS total
FROM operations O
JOIN sellers S on O.seller_id = S.seller_id
JOIN transactions T on O.trans_id = T.trans_id
WHERE O.datetime >= CURDATE()-1 AND T.name IN ('BUY','SELL')
GROUP BY S.name
ORDER BY total
  

Честно говоря, вы могли бы даже удалить объединение с таблицей транзакций и использовать O.trans_id в вашем предложении where.

СМОТРИТЕ ДЕМОНСТРАЦИЮ ЗДЕСЬ

Комментарии:

1. Большое спасибо, Госфлай! Это count(1) as total …. Я бы не преуспел

2. @troubadour: count(1) это просто запутанный способ простого count(*) , т.е. подсчета строк. Ваш собственный count(sellers.trans_id) работает так же хорошо, но скорее должен быть count(operations.trans_id) , и в этом случае вы могли бы даже внешне присоединиться к таблице операций и, таким образом, включить продавцов с нулевым количеством. Похоже, что весь ваш собственный запрос действительно отсутствовал, так это соответствующее GROUP BY предложение и ограничение диапазона дат.

3. WHERE date(O.datetime) >= CURDATE() то же WHERE O.datetime >= CURDATE() самое, что и, кстати. Только хуже, потому что применение функции даты может помешать СУБД использовать индекс.

4. О да, вы совершенно правы, позвольте мне это исправить. Спасибо @ThorstenKettner.

5. @ThorstenKettner спасибо, вы правы, просто ошибка при написании. здесь нужно понимать основную связь между count() и предложением where .. сумма выполняется здесь

Ответ №2:

Вот решение для вашего первого запроса

 Select a.name, a.count from
(select seller.name name, Count(Transaction.Tran_id) count
from seller, Transaction, Operation
where seller.Seller_id = Operation.Seller_Id
and Transaction.Tran_id = Operation.Tran_id
and Transaction.Tran_id=1
and Operation.datetime between (datetime 1 amp; datetime2)
group by seller.name) a
order by a.count
  

Второе решение :-

 Select a.name, a.count from
(select seller.name name, Count(Transaction.Tran_id) count
from seller, Transaction, Operation
where seller.Seller_id = Operation.Seller_Id
and Transaction.Tran_id = Operation.Tran_id
and Transaction.Tran_id in (1, 2)
and Operation.datetime between (datetime 1 amp; datetime2)
group by seller.name) a
order by a.count
  

Комментарии:

1. Спасибо, Вибхор, тоже отлично, и лучший результат для другого случая! Я расследую …..