MySQL: ранжирование из нескольких таблиц, подзапросы? - PullRequest
0 голосов
/ 21 сентября 2018

Это вопрос MySQL.У меня есть три таблицы со следующими столбцами:

transactions (table): transact_id, customer_id, transact_amt, product_id,
products (table): product_id, product_cost, product_name, product_category
customers (table): customer_id, joined_at, last_login_at, state, name, email

Я хотел бы запрос, который находит самый популярный элемент в каждом штате и штате.Одна из хитростей заключается в том, что у некоторых product_name есть несколько product_id.Поэтому я, хотя и объединяю три таблицы, которые генерируют вывод с двумя столбцами: state и product_name.До этого момента все работало нормально:

SELECT p.product_name, c.state
FROM products p
INNER JOIN transactions t
ON p.product_id = t.product_id
INNER JOIN customers c
ON c.customer_id = t.customer_id

Выбирает все продукты и штаты, в которых находится клиент.Проблема в том, что я не могу найти способ оценить самый популярный продукт в каждом штате.Я пробовал разные группы, упорядочить и использовать подзапросы без успеха.Я подозреваю, что мне нужно делать подзапросы, но я не могу найти способ их решить.Ожидаемый результат должен выглядеть следующим образом:

 most_popular_product | state
 Bamboo               | WA
 Walnut               | MO

Любая помощь будет принята с благодарностью.

Спасибо!

1 Ответ

0 голосов
/ 21 сентября 2018

Вам нужен подзапрос, который получает количество транзакций для каждого продукта в каждом состоянии.

SELECT p.product_name, c.state, COUNT(*) AS count
FROM products p
INNER JOIN transactions t
ON p.product_id = t.product_id
INNER JOIN customers c
ON c.customer_id = t.customer_id
GROUP BY p.product_name, c.state

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

SELECT state, MAX(count) AS maxcount
FROM (
    SELECT p.product_name, c.state, COUNT(*) AS count
    FROM products p
    INNER JOIN transactions t
    ON p.product_id = t.product_id
    INNER JOIN customers c
    ON c.customer_id = t.customer_id
    GROUP BY p.product_name, c.state
) AS t
GROUP BY state

Наконец, объедините их вместе:

SELECT t1.product_name AS most_popular_product, t1.state
FROM (
    SELECT p.product_name, c.state, COUNT(*) AS count
    FROM products p
    INNER JOIN transactions t
    ON p.product_id = t.product_id
    INNER JOIN customers c
    ON c.customer_id = t.customer_id
    GROUP BY p.product_name, c.state
) AS t1
JOIN (
    SELECT state, MAX(count) AS maxcount
    FROM (
        SELECT p.product_name, c.state, COUNT(*) AS count
        FROM products p
        INNER JOIN transactions t
        ON p.product_id = t.product_id
        INNER JOIN customers c
        ON c.customer_id = t.customer_id
        GROUP BY p.product_name, c.state
    ) AS t
    GROUP BY state
) AS t2 ON t1.state = t2.state AND t1.count = t2.maxcount

Это в основном тот же шаблон, что и SQL выбирает только строки с максимальным значением в столбце , просто используяпервый сгруппированный запрос как таблица, которую вы пытаетесь сгруппировать.

...