webForumDet fria alternativet

SQL-beräkning

5 svar · 969 visningar · startad av SoulGod

SoulGodMedlem sedan aug. 20051 395 inlägg
#1

Jag har en databas som ser ut såhär:
id - namn - link - sex - lag - bp - ml

bp & ml innehåller siffror som jag vill använda i en beräkning.
Dock blir mina uträkningar i PHP ganska avancerade, och jag undrar därför:

Finns det stöd i MySQL i att den kan beräkna saker direkt i systemet? (utan extern koppling).

Det jag "hoppas" på är att kunna göra en till kolumn som heter "total" och "snitt"... Och att total automatiskt lägger ihop bp + ml ..
Och att snitt då tar total / 2 ..

Går det?

@ndersMedlem sedan juni 200026 914 inlägg
#2
select id, namn, link, sex, lag, bp, ml, bp+ml as total, (bp+ml)/2 as snitt
from tabell
group by id, namn, link, sex, lag, bp, ml

Edit: för inte menar du att du vill lagra de uträknade värdena direkt i tabellen? I så fall borde du använda triggers för update och insert.

SoulGodMedlem sedan aug. 20051 395 inlägg
#3

Jag vet inte vad som blir bäst ...
Mitt problem är att jag kommer behöva göra en himla massa uträkningar..

SELECT bp FROM `wp_rvb` WHERE `sex` = "K"
Addera ihop alla dessa världen och sedan dela med numsql_rows för ovan SELECT-sats..

Och det blir totalt 4 varianter av just denna SELECT-sats..
Aldrig använt triggers / update / insert .. så det känns svårt :P

@ndersMedlem sedan juni 200026 914 inlägg
#4

Du förklarar lite dåligt, tror jag. :)

Det är klart att du kan göra allt i SQL - men risken är att det blir onödigt svårt och oöverblickbart. Är det det här du ska göra, som du beskriver i ditt senaste inlägg, så ska du inte fundera på triggers.

Du kan göra det med subqueries, men det är inte så übersexigt.

SELECT bp, 
	(SELECT sum(bp) FROM wp_rvb WHERE sex = 'K') as totalt,
	(SELECT avg(bp) FROM wp_rvb WHERE sex = 'K') as snitt
FROM wp_rvb WHERE sex = 'K'
SoulGodMedlem sedan aug. 20051 395 inlägg
#5

Ja - det är jag nog ..
Det jag är ute efter är att få ut 4 stycken olika uträkningar.

Uträkning 1:
SELECT bp FROM wp_rvb WHERE sex = 'K' ..
Addera ihop alla summor från bp, dela med antalet rader och sedan visa upp det..

Uträkning 2:
SELECT ml FROM wp_rvb WHERE sex = 'K' ..
Addera ihop alla summor från ml, dela med antalet rader och sedan visa upp det..

Uträkning 3:
SELECT bp FROM wp_rvb WHERE sex = 'T' ..
Addera ihop alla summor från bp, dela med antalet rader och sedan visa upp det..

Uträkning 4:
SELECT ml FROM wp_rvb WHERE sex = 'T' ..
Addera ihop alla summor från ml, dela med antalet rader och sedan visa upp det..

Den koden jag kör just nu (för att uthämta grunden är)

<?PHP
global $wpdb;
 
	$sql_bp_k = "SELECT bp FROM `wp_rvb` WHERE `sex` = 'K'";
 	$comments = $wpdb->get_results($sql_bp_k);

 	echo  $wpdb->num_rows . 'Rows Found';
	
 	foreach ($comments as $comment) {
 	echo $comment->bp;
 	echo " / ";
	}
?>

Jag har nu gjort separata länkar till allting, så det är "fult" löst ..
Dock... hur frågar jag ut servern efter snittvärdet?
Säg som sagt att jag har kolumnerna id - namn - link - sex - lag - bp - ml
...

jag vill hämta ut de 10 bästa (med högst snittvärde på bp & ml).
Så..
SELECT * FROM wp_rvb ORDER BY (snittvärdet av bp&ml ihop) LIMIT 10
....

aasahMedlem sedan mars 20033 451 inlägg
#6
SELECT
   sex,
   Avg(bp) [BpMedel],
   Avg(ml) [MlMedel]
FROM
   wp_rvb
GROUP BY
   sex

Ger en rad per sex med medelvärdena för bp och ml. Borde fixa problem 1-4.

SoulGod skrev:

jag vill hämta ut de 10 bästa (med högst snittvärde på bp & ml).
Så..
SELECT * FROM wp_rvb ORDER BY (snittvärdet av bp&ml ihop) LIMIT 10
....

Om du kan tänka dig att få ut en extra kolumn i resultatet med sorteringsvärdet så borde du kunna fixa detta i en enda fråga. Annars måste du eventuellt mellanlagra ovanstående i en temp-tabell först innan du ordnar om resultatet, men i princip:

SELECT
   sex,
   Avg(bp) [BpMedel],
   Avg(ml) [MlMedel],
   Avg(bp) + Avg(ml) [SortKol]
FROM
   wp_rvb
GROUP BY
   sex
ORDER BY
   Avg(bp) + Avg(ml) DESC
LIMIT 10

Det är också möjligt att du kan ordna raderna efter denna summa utan att plocka ut den under SELECT.

Genererad på 375 ms · cache AV · v20260730165559-full.f96bc7eb