#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. Спасибо, Вибхор, тоже отлично, и лучший результат для другого случая! Я расследую …..