Avatar billede hrole Mester
11. februar 2012 - 19:27 Der er 9 kommentarer og
2 løsninger

Udtræk af enkelte felter fra bestemte kolonner i mysql

Hej,

Følgende tabel haves (simplificeret)
id navn 1990 1991 1992 1993 1994
1 mads 10 12 13 18 19
2 ole 90 91 78 22 19
3 peter 89 10 98 89 99

Jeg vil nu gerne har trukket resultat ud for bestemt år for personerne, fx 1991:
mads 12
ole 91
peter 10

Hvordan gøres det lettest?
Avatar billede Broxigar Praktikant
11. februar 2012 - 19:38 #1
SELECT navn, 1991;

Det er vel det nemmeste tror jeg
11. februar 2012 - 19:40 #2
Du har vel prøvet SELECT navn, 1991 FROM mytabel .  Giver det ikke den tilsigtede virkning?
11. februar 2012 - 19:40 #3
Så Broxigar kom først.
11. februar 2012 - 19:56 #4
Men jeg kan ikke dy mig for at kommentere om din datastruktur.  Hvis værdierne i kolonnerne 1990, 1991, o.s.v. er, for eksempel, antal points personen fik det år, så vil du skulle forandre tabelstrukturen hvis du på et tidspunkt også vil vise points i 1995.  En såkaldt normaliseret datastruktur vil have en tabel for personer med id, navn, og hvad der ellers er at fortælle om personen såsom adresse og telefonnummer.  Og så en særskilt tabel for 'points_per_år med kolonnerne id, person_id, år, og points.

I dit tilfælde ville tabellerne få værdierne

person
id navn
1  mads
2  ole
3  peter

points_per_år
id person_id år points
1  1              1990  10
2  2              1990  90
3  3              1990  89
4  1              1991  12
5  2              1991  91
6  3              1991  10
o.s.v.

Så kan du fylde flere år med points på så tosset du vil uden at skulle omprogrammere tabellerne.  Så finder du points i 1991 således:

SELECT pe.navn, po.points FROM person pe JOIN points_per_år po ON pe.id = po-.person_id WHERE po.år = 1991

Og points for mads i årene 1991 til 1994:

SELECT pe.navn, po.points FROM person pe JOIN points_per_år po ON pe.id = po-.person_id WHERE pe.navn = 'mads' AND år BETWEEN 1991 AND 1994
Avatar billede hrole Mester
11. februar 2012 - 21:01 #5
Jo, det havde jeg tænkt. Men jeg tænkte om det kunne løses med følgende, hvor jeg i hver echo $row['navn'] specifikt valgte et år fx 1991. Men der er måske ikke andre veje uden om en SELECT for hvert navn?

<p>Point for 1991</p>
<?php $qry = "SELECT * FROM mytable";
$res = mysqli_query($dbc, $qry); ?>
<table>
        <thead>
          <tr>
          <th>Navn</th>
          <th>Point</th>
          </tr>
        </thead>
  <?php while ($row = mysqli_fetch_array($res)) { ?>
        <tbody>
          <tr>
          <td><?php echo $row['navn']; ?></td>
          <td><?php echo $row['point']; ?></td>
          </tr>
        </tbody>
        <?php } ?>
        </table>

Christian_belgien: Jeg kan se pointen, men vil egentlig helst holde mig til én tabel for overskuelighedens skyld da år kommer til at løbe over ca. 150 år.
11. februar 2012 - 21:18 #6
Hvis du vil starte med SELECT * FROM mytable, så kan du fortsætte:

<p>Point for 1991</p>
<?php $qry = "SELECT * FROM mytable";
$res = mysqli_query($dbc, $qry); ?>
<table>
        <thead>
          <tr>
          <th>Navn</th>
          <th>Point</th>
          </tr>
        </thead>
  <?php while ($row = mysqli_fetch_array($res)) { ?>
        <tbody>
          <tr>
          <td><?php echo $row['navn']; ?></td>
          <td><?php echo $row['1991']; ?></td>
          </tr>
        </tbody>
        <?php } ?>
        </table>
Avatar billede olebole Juniormester
11. februar 2012 - 21:19 #7
<ole>

Ikke mindst for overskuelighedens skyld - og netop da der er tale om 150 år - vil Christians løsning være langt at foretrække. Det er jo derfor, vi bruger relationelle databaser som MySQL  =)

/mvh
</bole>
Avatar billede hrole Mester
11. februar 2012 - 21:33 #8
ok. Jeg fik ikke helt udtrykt mig korrekt. Under alle omstændigheder laver jeg forsøgsvis strukturen om som Christian_Belgien foreslog.

Foreslår 10 point til Broxigar og 20 til Christian_belgien.

Mange tak for input!
11. februar 2012 - 21:56 #9
..og så prøvede jeg noget af som jeg ikke var sikker på kunne lade sig gøre, men det gik godt.  I stedet for med din tabelstruktur, hvis du vælger at fastholde den, at skrive querien om hver gang du vil have points fra et nyt år kan du placere årstallet i en variabel.  Fordi årstallet er navnet på en kolonne skal den mellem ``.  For eksempel:

$år = "`1992`";
$qry = "SELECT navn, $år FROM mytable";
...
while($row = mysqli_fetch_array($res))
...
<td><?php echo $row[0];?></td>
<td><?php echo $row[1];?></td>
Avatar billede olebole Juniormester
12. februar 2012 - 00:59 #10
Sorry, men en tabel med 150+ kolonner hører sammen med 64k telefonmodem, HTML2.0, tabellayout uden CSS og brændefyrede dampbiler.

Det kan bruges uden at smelte brugerens tastatur eller flække hans monitor, men hører absolut ikke hjemme i moderne webløsninger  =)
Avatar billede hrole Mester
14. februar 2012 - 18:04 #11
Hvis du vil have point Broxigar så giv lyd
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