Avatar billede sevinding Juniormester
21. februar 2012 - 16:30 Der er 30 kommentarer og
1 løsning

Count fra flere tabeller

Hejsa.
Jeg har fire tabeller: 'class_yellow', 'class_green', 'class_polka' og 'class_white'.
I hver tabel har jeg felterne: 'name' og 'place'.
Det jeg gerne vil er at tælle 'place' 1, 2 og 3 sammen for hver rytter, fra hver tabel og lægge dem sammen til et resultat.
Forstået på den måde, at hvis en rytter har 2 podiepladser i 'class_yellow' og 2 i 'class_green' skulle det gerne skrives ud som 4 podiepladser.
For dem der kan det, er det nok ingen problem, men jeg er på total bar bund.
Avatar billede Vixo Novice
21. februar 2012 - 17:40 #1
Prøv med det her (håber jeg forstod dig rigtigt):

// Først henter jeg lige navnet
$slc_name = mysql_query("SELECT * FROM class_yellow") or die(mysql_error());
$row_name = mysql_fetch_array($slc_name);
$name = $row_name['name'];

// Nu finder vi place i forskellige tabeller, hvor navnet er det samme, som jeg lige har hentet.
// Hent fra class_yellow
$slc_yellow = mysql_query("SELECT * FROM class_yellow WHERE name='$name'" or die(mysql_error());
$row_yellow = mysql_fetch_array($slc_yellow);
$yellow_place = $row_yellow['place'];

// Hent fra class_green
$slc_green = mysql_query("SELECT * FROM class_green WHERE name='$name'" or die(mysql_error());
$row_green = mysql_fetch_array($slc_green);
$green_place = $row_green['place'];

// Hent fra class_polka
$slc_polka = mysql_query("SELECT * FROM class_polka WHERE name='$name'" or die(mysql_error());
$row_polka = mysql_fetch_array($slc_polka);
$polka_place = $row_polka['place'];

// Hent fra class_white
$slc_white = mysql_query("SELECT * FROM class_white WHERE name='$name'" or die(mysql_error());
$row_white = mysql_fetch_array($slc_white);
$white_place = $row_white['place'];

$plus = $yellow_place + $green_place + $polka_place + $white_place;


Så vil jeg i hvert table sætte 'place' til at have standardværdi=0
og så tror jeg nok det skulle virke. Ved ikke om der findes smartere måder at gøre det på, men sådan ville jeg gøre
21. februar 2012 - 18:01 #2
Dette her spurgte du ikke om, men jeg kan vanen tro ikke dy mig for at snakke tabelstruktur.  Jeg kan forstå, at ryttere kan vinde pladser i forskellige klasser, her klasserne yellow, green, polka, og white.  Hvis i stedet for at lave en tabel for hver af disse klasser du lavede en tabel Placeringer med felterne name, class, place, så kunne du få summen af første, anden, og tredjepladser per rytter med en simpel query:

SELECT name, COUNT(*) AS podiumpladser FROM Placeringer WHERE placering BETWEEN 1 AND 3 GROUP BY name

Og så et tillægsspørgsmål (skønt det er dit spørgsmål):  Kan der være for eksempel en klasse yellow i flere forskellige løb, således at en rytter kan få adskillige placeringer i class yellow?  Hvis rytter Olsen i class yellow har tre andenpladser og to femtepladser, ville det så ikke være gavnligt at vide i hvilke løb Olsen fik de forskellige pladser?  Hvis du har en tabel over løb, hvor hvert løb har en id, så ville det være nemt i tabellen class_yellow o.s.v. eller i tabellen Placeringer at indsætte et ekstra felt løb hvor du gemmer id'en fra det pågældende løb.
Avatar billede sevinding Juniormester
22. februar 2012 - 04:58 #3
Hej vixo.
Jeg har siddet og leget med dit forslag, men får flg:

Parse error: syntax error, unexpected ';' in /hsphere/local/home/nist1737/tourfacts.dk/test1.php on line 35

som er:

$slc_yellow = mysql_query("SELECT * FROM class_yellow WHERE name='$name'" or die(mysql_error());

Jeg kan bare ikke lure hvor den ';' er.

Christian.
At lave én tabel, er ikke noget jeg huer, da jeg har indtastet data i de 4 tabeller tilbage til 1903 hvor Tour de France startede. Der er kun det ene løb det drejer sig om.
22. februar 2012 - 06:34 #4
...men kan du se hvor meget nemmere det nu ville have været, hvis du fra starten havde lavet en enkelt tabel?  Fordelen ved en såkaldt normaliseret datastruktur er, at man så kan trække data ud på 'alle' mulige måder, også måder man ikke havde tænkt på da man oprettede tabellerne.

Men du behøver vel ikke at føre alle dataerne ind igen i hånden, hvis du vil kombinere de bestående tabeller.  Hvis du har en tabel class_yellow med felterne name og place og en masse data vil du kunne indsætte dataerne i en tabel Placeringer med felterne name, place, og klasse med denne php kode (ikke testet)

$tabel = 'class_yellow';
$result = mysql_query("SELECT * FROM $tabel");
while($row = mysql_fetch_array($result))
{
  $name = $row['name'];
  $place = $row['place'];
  mysql_query("INSERT INTO Placeringer VALUES($name, $place, $tabel);
}
Avatar billede Vixo Novice
22. februar 2012 - 07:20 #5
Tror jeg har fundet fejlen :p
Skriv istedet:

$slc_yellow = mysql_query("SELECT * FROM class_yellow WHERE name='$name'") or die(mysql_error());

fejlen var egentlig at der manglede en ")" :)

Jeg kan se jeg kom til at lave fejlen ved de andre også. De skal også lige rettes på samme måde :)
Avatar billede sevinding Juniormester
22. februar 2012 - 08:03 #6
Christian.
Da faldt jeg bag af vognen igen. Jo, jeg kan godt se fordelen ved en tabel.
Men jeg kan ikke gennemskue hvordan jeg overfører data fra mine tabeller til tabellen 'placeringer'.

vixo.
Det hjalp. Nu fik jeg en hel blank side. Hvad gør jeg for at se et reultat.

I skal begge ha tak for hjælpen sådan en tidlig morgenstund.
Avatar billede Vixo Novice
22. februar 2012 - 10:22 #7
skriver

echo $plus;

så skulle den gerne skrive slutresultatet :)
Avatar billede sevinding Juniormester
22. februar 2012 - 11:04 #8
Hej vixo.
Nu ryster du nok på hovedet.
Jeg får et enkelt 1 tal som resultat.
Så må jeg indrømme, at jeg har sovet i timen.
Jeg har en tabel 'ryttere' med alle 'name', og i de andre fire tabeller står 'name' bare som rytterens id.
Jeg ved jeg trækker store veksler på din tålmodighed, men jeg håber ikke det har skræmt dig.
Avatar billede Vixo Novice
22. februar 2012 - 11:10 #9
Slet ikke :) Men det var god information at komme med.
Prøv den her kode så:

// Først henter jeg lige navnet
$slc_name = mysql_query("SELECT * FROM ryttere") or die(mysql_error());
$row_name = mysql_fetch_array($slc_name);
$name = $row_name['name'];

// Nu finder vi place i forskellige tabeller, hvor navnet er det samme, som jeg lige har hentet.
// Hent fra class_yellow
$slc_yellow = mysql_query("SELECT * FROM class_yellow WHERE name='$name'" or die(mysql_error());
$row_yellow = mysql_fetch_array($slc_yellow);
$yellow_place = $row_yellow['place'];

// Hent fra class_green
$slc_green = mysql_query("SELECT * FROM class_green WHERE name='$name'" or die(mysql_error());
$row_green = mysql_fetch_array($slc_green);
$green_place = $row_green['place'];

// Hent fra class_polka
$slc_polka = mysql_query("SELECT * FROM class_polka WHERE name='$name'" or die(mysql_error());
$row_polka = mysql_fetch_array($slc_polka);
$polka_place = $row_polka['place'];

// Hent fra class_white
$slc_white = mysql_query("SELECT * FROM class_white WHERE name='$name'" or die(mysql_error());
$row_white = mysql_fetch_array($slc_white);
$white_place = $row_white['place'];

$plus = $yellow_place + $green_place + $polka_place + $white_place;

echo $plus;

det burde nok virke.
Hvis du sætter standardværdi for 'place' i alle dine tables, så de ikke er tomme. Så kan du derefter udfylde 'place' med et andet tal :)
Avatar billede sevinding Juniormester
22. februar 2012 - 11:35 #10
Hej igen vixo.
Der får jeg kun den allere første rytter ud fra ryttere'
Jeg kom til at nærlæse dit første forslag, hvor du foreslår at sætte standardværdi 0 på 'place'.
Det er ikke nogen god ide, da jeg bruger nummerering andre steder på siden. Der står ingen felter tomme.
Har prøvet:  WHERE name='$name' AND place <= 3 uden resultat.
Avatar billede sevinding Juniormester
22. februar 2012 - 11:44 #11
Hej vixo.
Lige en tanke.
Skal jeg ikke på en eller anden måde fortælle de 4 tabeller at name er lig med id fra 'ryttere'?
Avatar billede Vixo Novice
22. februar 2012 - 13:57 #12
Så længe felterne ikke er tomme så der intet problem :)

Og JA, for guds skyld sørg for at name på "ryttere" er det samme som  "name" i dine andre tabeller :D
Avatar billede sevinding Juniormester
22. februar 2012 - 15:05 #13
Se, det er lige det. I 'ryttere' står navnet stavet, og i de andre tabeller står 'name' som id'et fra 'ryttere'.
Hvordan fortæller jeg de andre 4 tabeller at 'name' = id?
Avatar billede Vixo Novice
22. februar 2012 - 15:41 #14
lav et felt i ryttere som hedder "id", giv den gerne auto_increment, så når man opretter bruger så får man automatisk et ikke-eksisterende id. Så skal du bare selecte id istedet for name, øverst i min kode
Avatar billede sevinding Juniormester
22. februar 2012 - 16:13 #15
Ok.
Så lige til aller sidst. Som jeg skrev i #10, bliver der kun hentet data for den aller første rytter i 'ryttere'

Se: http://www.tourfacts.dk/test1.php

Jeg har knap 5000 ryttere i tabellen,, som jeg gerne vil hente på.
Jeg har også prøvet at sætte en 'ORDER BY' ind, men lige meget hvordan jeg gjorde, kom der fejlmeling.
Jeg håber du kan bære over med en gamel mand.
22. februar 2012 - 18:13 #16
sevinding, jeg har ikke fulgt tråden i løbet af dagen (jeg er på skiferie og har haft andet at tage mig til.)  I #6 siger du, at du ikke kan gennemskue, hvordan du overfører data fra dine tabeller til tabellen Placeringer.  Betyder det, at du har studeret mit forslag i #4 men at det er uklart?  I så fald fortæl hvor.  Eller betyder det, at du ikke vil spekulere i de baner for øjeblikket?  I så fald holder jeg kæft.
Avatar billede sevinding Juniormester
23. februar 2012 - 03:35 #17
Christian.
Der er nogen der kan, og pas nu på med al den afterski:-)
Jeg har studeret dit forslag, og hvis det betyder, at jeg stadig kan bruge mine andre tabeller er jeg meget nysgerrig.
Jeg har oprettet en tabel med navn 'placeringer' og lagt scriptet ud, men jeg aner ikke hvordan jeg skal bruge det.
Men nyd nu din ferie først. Er ikke selv hjemme de næste par dage.
23. februar 2012 - 06:31 #18
Hvordan har du 'lagt scriptet ud'?  Har du placeret kodeforslaget på en side så det står indenfor <?php ?> tags og efter kode der forbinder til databasen?  Og når du så kalder den side, hvad sker der så?
Avatar billede sevinding Juniormester
23. februar 2012 - 07:36 #19
Det er lagt ud på den måde. Indenfor <?php ?> tags og efter kode der forbinder til databasen.
Når jeg kalder siden frem er siden helt blank.
Se: http://www.tourfacts.dk/test2.php
Avatar billede Vixo Novice
23. februar 2012 - 15:25 #20
Hvis du skal lave en liste over alle spillere og deres placeringer, så ville jeg nok også sige at du skal slette class_yellow osv, og sætte det som et felt under din "rytter" table.
Hvis du gør det, kan jeg godt forklare dig hvordan din kode skal se ud :)
Avatar billede sevinding Juniormester
23. februar 2012 - 16:05 #21
Hej vixo.
De 4 tabeller er, må jeg sige, hellige for mig.
Du skal have mange tak for dit forslag, og forsøg.
Jeg venter lige på forslag fra Christian.
23. februar 2012 - 17:49 #22
sevinding, #19 - ha ha, jeg fangede den, du ville teste hvor meget apres ski jeg havde gjort.  Naturligvis er der ikke noget at se på en side med min kode.  Min kode indeholder intet med echo eller andet der er synligt.  Men hvad sker der i din database når du kører koden?  Der skulle gerne være sket det, at indholdet fra tabellen class_yellow er kopieret til tabellen Placeringer.  (Og hvis du har kørt koden adskillige gange skulle class_yellow dataerne være kommet i Placeringer flere gange.)  Så jeg er interesseret i hvordan din Placeringer tabel ser ud.
Avatar billede sevinding Juniormester
24. februar 2012 - 04:57 #23
Gomorn Christian.
Stadig med alle lemmer intakte?
Nu ved jeg at du er et tålmodigt menneske, ellers havde du nok opgivet mig forlængst :-)
Der er absolut intet kommet over i 'placeringer'
Jeg kan se et stort potentiale i koden. Til min fordel.
Men af nysgerrighed er jeg pisket til at spørge hvordan det virker, hvis jeg ikke skal gøre andet end at lægge koden ud.
Kan jeg nøjes med at føre alle 'place' 1, 2 og 3 over?
24. februar 2012 - 16:05 #24
Netop hjemkommet fra skibakkerne, og jeg er stiv i alle lemmer undtagen et!

Du får ikke noget i tabellen placeringer.  Så foreslår jeg at undersøge hvorfor i et antal trin:

1.  Se om du får indholdet af class_yellow trukket ud.  Prøv med denne kode:

<?php
[connect til databasen]
$result = mysql_query("SELECT * FROM class_yellow")or die(mysql_error());
$antal = mysql_num_rows($result);
echo "ANTAL = $antal";
?>

Hvis du får en fejlmelding skrevet ud, så er der et problem med din query.  Fortæl mig i så fald hvad fejlmeldingen siger (med mindre du selv finder ud af hvad der er galt og retter det.)

Hvis du ikke får en fejlmelding, så skulle du gerne få skrevet ud "ANTAL = 27" eller hvor mange rækker der nu er i class_yellow.  Hvis du får skrevet ud "ANTAL = 0" eller "ANTAL = " så får du ikke trukket nogen resultater ud af class_yellow, og derfor er der heller ikke noget at indsætte i tabellen placeringer.

2.  Men hvis det går godt, altså hvis du får udskrevet det antal rækker der er i class_yellow, så foreslår jeg som den følgende test at se, om du overhovedet kan få tabellen placeringer i tale.  Hvis tabellen placeringer har de tre felter name, place, og class, og datatypen for alle tre tabeller er VARCHAR, så kunne du prøve sådan en kode:

<?php
[connect til databasen]
mysql_query("INSERT INTO placeringer VALUES('name1', '1', 'class_yellow')")or die(mysql_error());
?>

Hvis du får en fejlmelding, så er der nok problemer med tabellen placeringer.  Fortæl hvad fejlmeldingen siger.

Hvis der ikke er nogen fejlmelding, så gå ind og se, om der er tilføjet en række i tabellen placeringer.  Hvordan gør du det? Bruger du phpmyadmin?

3.  Hvis du kan trække data ud af class_yellow og du kan sætte data ind i placeringer, men du kan stadig ikke indsætte dataerne fra class_yellow i placeringer, så må vi tænke videre.
Avatar billede sevinding Juniormester
26. februar 2012 - 05:55 #25
Velkommen hjem fra bakkerne. Det med den mgl. stivhed kan der jo gøres noget ved :-)
Nå, ingen problemer med at trække data ud fra 'class_yellow'.
Har tilpasset den så den harmonerer med 'placeringer' mht. antal felter, feltnavn og datatype men får denne melding:

Column count doesn't match value count at row 1

Har selv prøvet at ændre:

mysql_query("INSERT INTO placeringer VALUES('name1', '1', 'class_yellow')")or die(mysql_error());

til:

mysql_query("INSERT INTO placeringer VALUES('name', 'place', 'class')")or die(mysql_error());

men er nok helt på afveje.

Jeps, phpmyadmin er i brug.
26. februar 2012 - 06:38 #26
Du får trukket data ud af class_yellow.  Fint.

Men du kan ikke få sata indsat i placeringer.  Fortæl mig hvordan tabellen placeringer er indrettet, hvilke felter, hvilke datatyper for felterne, har du autoincrement?
Avatar billede sevinding Juniormester
26. februar 2012 - 07:24 #27
Som sagt har jeg tilpasset 'class_yellow' 'placeringer'.
I begge tabeller er der 'id' 'name' 'place' og 'class'
I begge tabeller bruger jeg VARCHAR i alle felter undtagen 'id'
Kan det forøvrigt ikke ligeså godt være INT hvor der kun er tale om tal?
Autoincrement er en selvfølge for mig i begge tabeller.
26. februar 2012 - 08:01 #28
Skær det lige ud i pap.  Det er specifikt tabellen placeringer jeg spørger om, med henblik på at få testen med at placere data deri til at lykkes.  Siger du, at placeringer har disse fire felter:

id INT AUTOINCREMENT
name VARCHAR(256)
place VARCHAR(256)
class VARCHAR(256)

(hvis du har VARCHAR(noget andet) er det lige meget, så længe det er nok til at dække den største mulige værdi.)

I bekræftende fald forstår jeg fejlmeldingen med at 'column count does not match value count'.  Du giver tre værdier til fire kolonner.  Jeg foreslår denne ændrede kode for at teste forbindelsen til placeringer:

mysql_query("INSERT INTO placeringer(name, place, class) VALUES('name', 'place', 'class')")or die(mysql_error());

Så opgiver du tre værdier til tre kolonner.  Den fjerde kolonne fylder sig selv ud ved autoincrement.

Jeg kører nu hjem fra Østrig (til Belgien) og er derfor ikke på nettet før i aften.
Avatar billede sevinding Juniormester
26. februar 2012 - 09:00 #29
Hej igen Christian.
Håber du har haft en god tur hjem.

Har ændret dit første forslag:

$tabel = 'class_yellow';
$result = mysql_query("SELECT * FROM $tabel");
while($row = mysql_fetch_array($result))
{
  $name = $row['name'];
  $place = $row['place'];
  mysql_query("INSERT INTO Placeringer VALUES($name, $place, $tabel);
}

tl:

$tabel = 'class_yellow';
$result = mysql_query("SELECT * FROM $tabel");
while($row = mysql_fetch_array($result))
{
  $name = $row['name'];
  $place = $row['place'];
mysql_query("INSERT INTO placeringer(name, place, class) VALUES('name', 'place', 'class')")or die(mysql_error());
}

og så skete der noget.

id  name  place  class 
1  name place class
2  name place class

Sådan ser samtlige felter ud i 'placeringer'
Kan ikke lure hvor $ skal sættes ind
Avatar billede sevinding Juniormester
26. februar 2012 - 09:01 #30
Hej igen Christian.
Håber du har haft en god tur hjem.

Har ændret dit første forslag:

$tabel = 'class_yellow';
$result = mysql_query("SELECT * FROM $tabel");
while($row = mysql_fetch_array($result))
{
  $name = $row['name'];
  $place = $row['place'];
  mysql_query("INSERT INTO Placeringer VALUES($name, $place, $tabel);
}

tl:

$tabel = 'class_yellow';
$result = mysql_query("SELECT * FROM $tabel");
while($row = mysql_fetch_array($result))
{
  $name = $row['name'];
  $place = $row['place'];
mysql_query("INSERT INTO placeringer(name, place, class) VALUES('name', 'place', 'class')")or die(mysql_error());
}

og så skete der noget.

id  name  place  class 
1  name place class
2  name place class

Sådan ser samtlige felter ud i 'placeringer'
Har prøvet med $ flere steder uden held.
26. februar 2012 - 22:11 #31
Vi snakker vist i øst og vest.  Siden jeg er så dårlig til at kommunikere med dig må vi nok hellere stoppe.  Fordi du i #23 sagde: "Der er absolut intet kommet over i 'placeringer'" foreslog jeg i #24 at undersøge trin for trin hvor problemet lå.  Trin 1 skulle være at kikke på class_yellow alene og se om du kunne trækkes data ud.  Hvis det gik godt, skulle trin2 være at kikke på placeringer alene og se om du kunne sætte noget ind.  Når så det var kommet så langt at class_yellow virkede alene og placeringer virkede alene ville tiden være inde som trin 3 at kombinere de to tabeller, således at du kunne sætte det ind i placeringer som du trak ud af class_yellow.   

Du fortalte så i #25, at trin 1 gik godt, du kunne trække data ud af class_yellow.  Men trin 2 fejlede, du fik fejl når du prøvede at indsætte noget i placeringer.  Du gav så i #27 yderligere oplysninger om tabellen placeringer, og på baggrund af disse oplysninger var jeg temmelig sikker på hvor fejlen var, og jeg foreslog i #28 et nyt trin 2, at prøve at sætte test data ind i placeringer.  For test foreslog jeg dataerne 'name', 'place', og 'class'.  Jeg havde håbet, at du i dagens løb ville have prøvet det med success, så vi nu kunne gå igang med at kombinere de to tabeller, således at du fik de data ind i placeringer som du trak ud af class_yellow.

Det skete bare ikke.  I stedet gik du direkte over til at at forsøge at kombinere de to tabeller, men du blandede det sammen, så du trak data ud af class_yellow men satte test data ind i placeringer.  Når du højt og tydeligt fortæller mysql INSERT INTO placeringer .... 'name', 'place', 'class', hvordan kan det så undre dig, at det er det mysql gør?  Hvis du har klassens (class_yellow) værdi siddende i variabelen $tabel og navnets værdi siddende i variabelen $name og placeringens værdi siddende i variabelen $place, så skal queryen naturligvis være

mysql_query("INSERT INTO placeringer(name, place, class)VALUES($name, $place, $table)");

Jeg kommer som sagt til at slutte her.  Jeg opretter dette som svar i tilfælde af at du mener at have haft nytte af mine indlæg.  Hvis ikke, og med mindre du får bedre hjælp fra anden side, så må du selv oprette et svar og acceptere det.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester