Získejte nejnovější záznam podle data v mysql

0

Otázka

Mám tabulku, v níž jsem obchod, kód, cena a datum.

Kód je typu varchar, cena je typ float (ano, vím, že to je lepší ukládat je jako Double), datum je typu datum

create table prices (
 code varchar(15), 
 price float(5),
 date date
)

takže,

insert into prices (code,price,date) values
('ADV000001','2.1','2021-02-03'),
('ADV000001','0.3','2021-11-22'),
('ADV000001','20.0','2021-11-23'),
('ADV000001','31.4','2017-01-11'),
('ADV000001','99.99','2012-12-09'),
('ADV000123','31.4','2017-04-21'),
('ADV000123','0.4','2016-12-02'),
('ADV000123','31','2012-11-06'),
('ADV000991','3','2000-01-15'),
('ADV000991','1.4','2004-01-13'),
('ADV000991','0.9','2011-01-30'),
('ADV000991','12','2017-01-23'),
('ADV000991','854.82','2004-04-30'),
('ADV000991','231.11','2009-04-15'),
('ADV000991','242.66','2021-04-09'),
('ADV000912','111.1','2021-01-11'),
('ADV000912','1.4','2020-01-11'),
('ADV031242','75.48','2019-03-11'),
('ADV031242','231.42','2019-07-11'),
('ADV011912','1324.11','1994-11-11'),
('ADV000112','685.04','1993-06-11'),
('ADV000777','757.54','2001-06-11'),
('ADV000777','221.74','2002-09-11'),
('ADV000777','1352.12','2012-04-11'),
('ADV000215','856.81','2011-12-11'),
('ADV000202','511.99','2011-11-11')

Snažím se, aby to vybrat, ale to moc dobře nefunguje, přináší to správné datum, ale to mě přivádí každou cenu, není správné!!!!

SELECT 
code, price, date 
FROM 
prices 
WHERE 
date = (SELECT MAX(date) FROM prices) 

výsledek:

code       price    date
ADV000001   0.3    2021-11-23

V ideálním případě, to by mělo ukázat, každý kód s jeho příslušné ceny a nejnovější datum.

code           price    date
ADV000001      20       2021-11-23
ADV000123      31.4     2017-04-21
ADV000991    242.66     2021-04-09
...          ...          ... 

Nějaké nápady? možná dílčí poradit? skupina podle věty není práce!

MYSQL MAX() funkce nefunguje, nezáleží na skupiny podle kódů a jen mě přivádí jeden záznam. Zde je odkaz, kde se můžete rychle zeptat na vaše dotazy, ocenil bych to. dbfiddle.uk

mysql
2021-11-24 02:59:24
3

Nejlepší odpověď

1

Zde jsou vaše dotazy, ale první!!! Je to nikdy dobrý nápad použít SQL klíčová slova jako názvy sloupců. Pokud si myslíte, že musíte citovat tzhe fieldname s ve zpětném apostrofu.

získat jeden výsledek

SELECT 
CODE, price, DATE 
FROM 
prices 
WHERE 
`date`= (SELECT MAX(DATE) FROM prices);

získejte všechny výsledky

SELECT p1.`code`, p1.`maxdate`, p2.`price` FROM (
    SELECT `CODE`, MAX(`DATE`) AS maxdate FROM prices GROUP BY `CODE`) AS p1
LEFT JOIN prices p2 ON p1.`code`= p2.`code`AND p2.`date` = p1.maxdate
ORDER BY p1.`code`;

vzorek

MariaDB [order]> SELECT 
    -> CODE, price, DATE 
    -> FROM 
    -> prices 
    -> WHERE 
    -> `date`= (SELECT MAX(DATE) FROM prices);
+-----------+-------+------------+
| CODE      | price | DATE       |
+-----------+-------+------------+
| ADV000001 |    20 | 2021-11-23 |
+-----------+-------+------------+
1 row in set (0.06 sec)


MariaDB [order]> SELECT p1.`code`, p1.`maxdate`, p2.`price` FROM (
    -> SELECT `CODE`, MAX(`DATE`) AS maxdate FROM prices GROUP BY `CODE`) AS p1
    -> LEFT JOIN prices p2 ON p1.`code`= p2.`code`AND p2.`date` = p1.maxdate
    -> ORDER BY p1.`code`;
+-----------+------------+---------+
| code      | maxdate    | price   |
+-----------+------------+---------+
| ADV000001 | 2021-11-23 |      20 |
| ADV000112 | 1993-06-11 |  685.04 |
| ADV000123 | 2017-04-21 |    31.4 |
| ADV000202 | 2011-11-11 |  511.99 |
| ADV000215 | 2011-12-11 |  856.81 |
| ADV000777 | 2012-04-11 | 1352.12 |
| ADV000912 | 2021-01-11 |   111.1 |
| ADV000991 | 2021-04-09 |  242.66 |
| ADV011912 | 1994-11-11 | 1324.11 |
| ADV031242 | 2019-07-11 |  231.42 |
+-----------+------------+---------+
10 rows in set (0.01 sec)

MariaDB [order]> 
2021-11-24 03:35:13
0

Aby vaše Vyberte dotazu "Objednávky" v sestupném. Mluvím o výběrový dotaz, jak se dostat nejnovější data v databázi.

2021-11-24 03:24:19
0

Pokud používáte where `date` = (SELECT MAX(`date`) FROM `prices`) pak to bude vybrat pouze jednu poslední (MAX) z tabulky použít v tomto datu stavu. Výsledkem je zobrazení pouze 1 záznam.

Viz z této otázky

SELECT 
    `prices`.*
FROM 
    `prices`
INNER JOIN (
    SELECT MAX(`date`) AS `maxdate`, `price`, `code`
    FROM `prices`
    GROUP BY `code`
) AS `prices2` 
    ON `prices`.`date` = `prices2`.`maxdate`
ORDER BY `date` DESC

Výsledky:

kód cena datum
ADV000001 20 2021-11-23
ADV000991 242.66 2021-04-09
ADV000912 111.1 2021-01-11
ADV031242 231.42 2019-07-11
ADV000123 31.4 2017-04-21
ADV000777 1352.12 2012-04-11
ADV000215 856.81 2011-12-11
ADV000202 511.99 2011-11-11
ADV011912 1324.11 1994-11-11
ADV000112 685.04 1993-06-11
2021-11-24 03:39:18

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................