webForumDet fria alternativet

Multiplikation och addition av data från olika tabeller beroende av id

Databaser & SQL

4 svar · 998 visningar · startad av Minna

Medlem sedan juli 20096 inlägg
Frågan#1

Ok jag har fyra tabeller där alla har en id-kolumn som matchar varandra.

Tabell A har följande kolumner som är intressanta:

id | stad | typ
g1 göteborg 1
g2 göteborg 2
g3 göteborg 1
s1 stockholm 1
s2 stockholm 1
s3 stockholm 2

Tabell B, C och D har följande struktur men olika värden:

id | prisdag1 | prisdag2 | prisdag3 | prisdag 4 ..
g1 10 20 20 10
g2 30 20 20 10
g3 25 10 50 30
s1 24 50 40 60
s2 60 80 10 30
s3 40 68 50 40
...

- Det jag vill göra är att ta ut alla id:n från en stad med en typ från tabell A.

- De id som är uttagna ur tabell A ska också tas ut ur tabell B, C och D. Där jag för varje id på en speciell dag ska göra följande matematiska operation.

tabell B + (variabel x)*tabell C + (variabel y)*tabell D

Dessa ska sedan sorteras från lägsta till högsta och sen skrivas ut i tabell form:

Dvs vill jag ha ut alla id:en från staden göteborg av typen 1 så ska slutresultatet bli:

id | totalpris
g1 tabellB.id.g1 + x*tabellC.id.g1 + y*tabellD.id.g1
g3 tabellB.id.g3 + x*tabellC.id.g3 + y*tabellD.id.g3

Jag kör MySQL som jag sedan använder med PHP

Går det att få ut en sådan här uppgift direkt ur en fråga eller måste man skapa nya tabeller?

Tack på förhand för hjälp!

Medlem sedan mars 2009452 inlägg
#2

1. du har konstiga ID nummer. det brukar var siffror.
2. "göteborg typ 1" finns ju med 2 ggr, samma med "stockholm typ 1"
3. vad är det du vill göra!?
4. tabell b, c, och d har räknare, för all del, men borde även ha en kolumn som heter något i stil med intCityID eller intCityTypeID för att peka på rätt stad i tabell A.

Det går ju säkert att göra lite hur som helst... med vilka namn som helst... men försök att vara lite konsekvent och undvik bokstäver som namn på dina tabeller!! Det skadar inte att vara tydlig! Dels för din egen del, dels för situationer som dessa, då du ska försöka få andra att ta del av din kod och dessutom försöka att förstå hur du tänker....

Trust me. Det händer! :-)

Bättre med lite längre namn där man förstår vad som avses än att falla för frestelsen att ha så korta namn som möjligt -- på bekostnad av tydlighet. Du kommer själv glömma hur du tänkte... även om du inte tror på det just nu. Testa själv! Kör ett annat projekt i en vecka eller två och du är helt borta i dessa förkortningar! :-) Det är en dålig grej!

Medlem sedan dec. 20025 483 inlägg
#3
select a.id
     , b.prisdag1 + c.prisdag2*x + d.prisdag3*y
  from tbl_a a
inner
  join tbl_b b
    on a.id = b.id
inner
  join tbl_c c
    on b.id = c.id
inner
  join tbl_d d
    on c.id = d.id
 where a.stad = 'göteborg'
   and a.typ = 1
order
    by 2
Medlem sedan aug. 20039 340 inlägg
#4

Hmm, få se om Peter eller jag tolkade frågan rätt...
Det är lite oklart vad prisdagx gör, och om priserna för de olika dagarna ligger i olika tabeller, eller som kolumner i var och en av tabellerna.

SELECT 
ta.id AS id
(
	SELECT CASE ta.typ
	WHEN 1 THEN tb.prisdag1
	WHEN 2 THEN tb.prisdag2
	WHEN 3 THEN tb.prisdag3
	WHEN 4 THEN tb.prisdag4
	END
)  +
$x * (
	SELECT CASE ta.typ
	WHEN 1 THEN tc.prisdag1
	WHEN 2 THEN tc.prisdag2
	WHEN 3 THEN tc.prisdag3
	WHEN 4 THEN tc.prisdag4
	END
)  +
$y * (
	SELECT CASE ta.typ
	WHEN 1 THEN td.prisdag1
	WHEN 2 THEN td.prisdag2
	WHEN 3 THEN td.prisdag3
	WHEN 4 THEN td.prisdag4
	END
)  AS totalsumma
FROM tabellA ta
JOIN tabellB tb ON tb.id = ta.id
JOIN tabellC tc ON tc.id = ta.id
JOIN tabellD td ON td.id = ta.id
WHERE ta.stad = '$stad' AND ta.typ = '$typ'
ORDER BY totalsumma ASC;
Medlem sedan juli 20096 inlägg
#5

Ledsen om jag va lite otydlig i frågan, skulle självklart formulerat lite tydligare.

Peter S har iaf tolkat frågan helt rätt och givit ett svar som verkar fungera! :-)

Tack så jättemycket!

262 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)