![]() |
mySQL - join eller group problem
Jag har två tabeller
--------------------------------------- En produkttabell TabellA (i verkligheten avsevärt många fler kolumner) Kod:
Kod:
Priserna förändras över tid och jag vill spara all historik. Här kan vi se att priset på produkt ändrats tre gånger i dec Kod:
Kod:
Vad skriver jag för att det alltid ska välja senast pris? Alltså ett sånt här resultat. Kod:
|
Får ju problem redan här:
Kod:
Kod:
|
Skulle jag varit dig hade jag haft en separat tabell för de nuvarande priserna. Varje gång du ändrar ett pris så körs en trigger som lägger till en post i en tabell som loggar priset.
Går säkert lösa på många sätt som sagt men så har jag gjort med andra typer av data som ska loggas. |
Något sånt här borde fungera:
Kod:
SELECT TabellA.*, MAX(TabellB.datum), TabellB.pris from TabellA INNER JOIN TabellB on TabellB.PId = TabellA.id GROUP BY TabellA.id |
Här är ett enkelt sätt att göra det på, så du enbart får senaste priset:
Kod:
SELECT * Här är ett annat enkelt sätt att göra ungefär samma sak fast med produkttabellen med, så man set produkten i klartext: Kod:
SELECT p.Artikelnummer, p.ProduktNamn, |
Dålig färändring i Forumet att man inte kan redigera egna inlägg mer än 15 minuter efter första spara!
Jag körde SQL-server men det borde vara närmast identisk SQL-kod. Jag hade följande tabeller i mitt exempel: Kod:
CREATE TABLE [dbo].[produkt] |
Citat:
Du skulle ju rentav kunna ha priset och senaste uppdateringsdatum direkt i produkttabellen och sedan ha en tabell med prishistorik. Då slipper du joins helt och får en snyggare(enligt mig) och mer effektiv(bättre prestanda om du slipper joina) tabellstruktur. |
Citat:
Om man ska ha en historiktabell så måste man varje gång man gör én prisförändring först läsa fram det gamla priset för att lagra det i en historiktabell och sen lägga in det nya priset i "den aktuella pristabellen" detta måste även göras med en transaktion så det går att backa om någon del inte går igenom. Med den enklare varianten så slipper man hantera transaktioner. Vad vi pratar om för prestandaeffektivisering är endast frågan om millisekunder vid prisfrågan, det tycker i vart fall inte jag är värt den betydligt mer komplicerade strukturen som det lätt kan bli fel i, det är mindre risk att det blir fel om man bara lägger till en extra insert varje gång priset förändras. Den mer komplexa lösningen kräver även mer "knowledgein the head" dvs kunskap hos den som administrerar databasen än den enklare lösnuingen där det är fokus på "Knowledge in the world" (dvs mer kunskap finns i databasen i sig själv). |
Gör man om det hela till StoredProcedures så blir det lite snabbare och enklare att hantera (man kan då ange valfritt datum när man vill veta aktuell prislista, vilket gör att man kan hantera framtida prisförändringar):
Kod:
CREATE PROCEDURE [dbo].[SenasteProduktPrisAlt1] |
Citat:
Är det väldigt mycket läsningar och få uppdateringar av priset(vilket borde vara normalfallet) blir det dock en viss prestandavinst med "min" lösning. I de flesta sammanhang är det nog inte så mycket att bry sig om dock. Resultatet kan ju även cachas om prestanda är viktigt. |
Alla tider är GMT +2. Klockan är nu 13:22. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson