Табло из MySQL данных - PullRequest
       35

Табло из MySQL данных

1 голос
/ 29 апреля 2020

У меня есть база данных с двумя таблицами. Один содержит данные об элементах, а другой - статистику цен для элементов в другой таблице.

Item Table itemid (int, auto increment) | имя (варчар) | описание (varchar) | add_on (datetime)

таблица статистики: id (int, автоинкремент) | элемент (int) | цена (int) | date_seen (datetime)

Столбец 'itemid' в первой таблице является уникальным и упоминается как 'item' во второй таблице. Каждый раз, когда цена проверяется на предмет, она добавляется в таблицу статистики, если prioce изменился с момента последней проверки

Например, таблицы выглядят так:

Item Table
itemid (int, auto increment) | name (varchar) | description (varchar) | added_on (datetime)
1  | testproduct1 | This is a testproduct | 2020-04-23 16:43:47
2  | testproduct2 | This is a testproduct too | 2020-04-23 17:08:32
stats table:
id (int, auto increment) | item (int) | price (int) | date_seen ( datetime )
1 | 1 | 7 | 2020-04-23 09:12:00
2 | 1 | 4 | 2020-04-23 09:34:00
3 | 2 | 8 | 2020-04-23 09:12:00
4 | 2 | 6 | 2020-04-23 09:34:00
5 | 1 | 3 | 2020-04-23 10:08:00
6 | 2 | 4 | 2020-04-23 10:08:00

Допустим, я бы хотел получить Top5 из Элементы, добавленные сегодня, отсортированные по параметру last_seen DES C, а затем отсортированные по цене DES C, так что вы получите следующий результат:

NAME          |PRICE| date_seen
 testproduct2 | 4   | 2020-04-23 10:08:00
 testproduct1 | 3   | 2020-04-23 10:08:00

Как бы я go сказал об этом? Я попытался сделать следующее Какой будет правильный запрос, чтобы получить желаемый результат? Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Вы можете использовать подзапрос для фильтрации по самой последней записи stats для элемента:

select i.name, s.price, s.date_seen
from item i
inner join stats s on s.item = i.itemid
where s.date_seen = (
    select max(s1.date_seen) 
    from stats s1 
    where 
        s1.date_seen >= '2020-04-23' 
        and s1.date_seen < '2020-04-24' 
        and s1.item = s.item
)
order by s.date_seen desc, s.price

Обратите внимание, что я изменил предикаты на дату: ни одна функция не вступает в игру, поэтому она может воспользоваться индекса.

0 голосов
/ 29 апреля 2020

У вас была запятая во внутреннем селекте в конце ´, которая была намного

, и GROUP By должна прийти до ЗАКАЗАТЬ

SELECT *
FROM (
SELECT
    i.itemid,
    i.name,
    s.price,
    s.date_seen AS sdate
FROM
   items i
INNER JOIN stats s
    ON i.itemid = s.item
WHERE i.added_on LIKE '2020-04-23%'
) AS sub  
GROUP BY itemid
ORDER BY `sub`.`sdate`  DESC,`sub`.`price` DESC

Чтобы получить последнюю дату и цену, вы должны получить правильную строку статистики с подзапросом.

SELECT
    i.itemid,
    i.name,
    s.price,
    s.date_seen AS sdate
FROM
   items i
INNER JOIN stats s
    ON i.itemid = s.item
WHERE s.date_seen = (SELECT MAX(date_seen) 
FROM stats WHERE date_seen <= i.added_on and s.item = i.itemid)

Есть несколько способов сделать что-либо.

SELECT
    i.itemid,
    i.name,
    s.price,
    s.date_seen AS sdate
FROM
   items i
INNER JOIN stats s
    ON i.itemid = s.item
INNER JOIN 
(SELECT MAX(date_seen) maxdate,item FROM stats GROUP BY item) s1 ON s1.item = s.item AND s.date_seen = s1.maxdate;

См. новый пример https://www.db-fiddle.com/f/wUqVKNZy96RjR7hTk3md7o/3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...