Gå til innhold

Hente ut data fra flere tabeller i en database inn i samme foreach?


Anbefalte innlegg

Heisann!

 

Er nybegynner i PHP, men driver med en applikasjon i Codeigniter som jeg sysler litt med. Denne er laget av noen andre, men jeg hjelper til litt i ny og ne. Begynner å få grei oversikt, men ha nå kommet frem til en utfordring jeg ikke klarer å løse.

 

Jeg har en database, med tre tabeller.

  • Den ene tabellen(users), lagrer brukerinformasjon, som ID, navn, mail, passord osv.
  • Den andre tabellen(fag), lagrer informasjon om faget, som ID, tittel, beskrivelse, bruker_ID osv.
  • Den tredje tabellen(kapitler), lagrer informasjon om selve kapitlene, som ID, kapittel navn, beskrivelse, fag_ID og bruker_ID

ID-verdiene i alle tabellene er det vanlige, med auto increment.

 

bruker_ID henger sammen med IDen til brukerne. Altså IDen i tabellen users. Eksempel: Lager en bruker som har en ID på 31 et fag, med et kapittel i, vil bruker_ID i fag og kapitler være 31.

 

fag_ID henger sammen med IDen til fagene. Altså IDen i tabellen fag.

 

Det som er utfordringen, er at jeg ikke vet åssen jeg skal klare å hente ut alle disse tre tabellene i en foreach loop, hvor alt henger sammen.

 

Jeg kan vise min foreach loop slik den er per idag:

 

<?php foreach ($fag as $item): ?>
 <div class="well">
   <h1><?php echo $item['title'] ?></h1>
   <p><?php echo $item['description'] ?></p>
 </div>
<?php endforeach; ?>

 

Denne henter da altså ut tittel og beskrivelse av et fag.

 

Jeg kunne gjerne tenkt meg å hente ut navnet på brukeren som har laget faget, samt hvor mange kapitler det er i de enkelte fagene, i tillegg til det jeg gjør idag.

 

Er det noen som veit åssen jeg kan gjøre dette?

Lenke til kommentar
Videoannonse
Annonse

Du burde se litt på forskjellige joins! Da kan du hente og matche data fra andre tabeller basert på innholdet i forskjellige rader.

 

Her har jeg laget et eksempel, hvor jeg henter info når fagid'en = 1:

SELECT
t1.tittel AS FagTittel,
t2.id AS BrukerSomLagetFaget,
COUNT(t3.id) AS AntallKapitler
FROM
fag AS t1
LEFT JOIN users AS t2
 ON t1.bruker_ID = t2.id
LEFT JOIN kapitler AS t3
 ON t1.id = t3.fag_ID
WHERE
t1.id = 1

 

Med denne spørringen kan du hente ut tittelen på faget med $item['FagTittel'], Brukeren som har laget kapitelet sin ID med $item['BrukerSomLagetFaget'] og $item['AntallKapitler'] for hvor mange kapitler det finnes i det faget.

 

Database:

 

-- --------------------------------------------------------

-- Host: 127.0.0.1

-- Server version: 5.1.53-community-log - MySQL Community Server (GPL)

-- Server OS: Win64

-- HeidiSQL version: 7.0.0.4140

-- Date/time: 2012-06-21 15:50:25

-- --------------------------------------------------------

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;

/*!40101 SET NAMES utf8 */;

/*!40014 SET FOREIGN_KEY_CHECKS=0 */;

-- Dumping database structure for hei

CREATE DATABASE IF NOT EXISTS `hei` /*!40100 DEFAULT CHARACTER SET latin1 */;

USE `hei`;

 

-- Dumping structure for table hei.fag

CREATE TABLE IF NOT EXISTS `fag` (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,

`tittel` int(10) unsigned DEFAULT NULL,

`bruker_ID` int(10) unsigned DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;

-- Dumping data for table hei.fag: 0 rows

/*!40000 ALTER TABLE `fag` DISABLE KEYS */;

INSERT IGNORE INTO `fag` (`id`, `tittel`, `bruker_ID`) VALUES

(1, 666, 1),

(2, 777, 2),

(3, 888, 2),

(4, 999, 2);

/*!40000 ALTER TABLE `fag` ENABLE KEYS */;

 

-- Dumping structure for table hei.kapitler

CREATE TABLE IF NOT EXISTS `kapitler` (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,

`navn` int(10) unsigned DEFAULT NULL,

`fag_ID` int(10) unsigned DEFAULT NULL,

`bruker_ID` int(10) unsigned DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

-- Dumping data for table hei.kapitler: 0 rows

/*!40000 ALTER TABLE `kapitler` DISABLE KEYS */;

INSERT IGNORE INTO `kapitler` (`id`, `navn`, `fag_ID`, `bruker_ID`) VALUES

(1, 111, 1, 1),

(2, 222, 1, 1),

(3, 333, 2, 2);

/*!40000 ALTER TABLE `kapitler` ENABLE KEYS */;

 

-- Dumping structure for table hei.users

CREATE TABLE IF NOT EXISTS `users` (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,

`navn` int(10) unsigned DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

-- Dumping data for table hei.users: 0 rows

/*!40000 ALTER TABLE `users` DISABLE KEYS */;

INSERT IGNORE INTO `users` (`id`, `navn`) VALUES

(1, 123),

(2, 321);

/*!40000 ALTER TABLE `users` ENABLE KEYS */;

/*!40014 SET FOREIGN_KEY_CHECKS=1 */;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

 

 

Lenke til kommentar

Det er viktig å presssisere at å lære seg programmering og databaser samtidig er litt overkill - prøv å lær en av gangen. Databaser er såpass stort tema at man kan fint se på det som et eget fag - og om du prøver å lære deg databaser samtidig som du lærer deg programmering så ender du ofte opp med å ikke lære deg å forstå databasene ordentlig.

 

I webprogrammer, men også annet, er databaser noe av det som oftest skaper overhead og treghet i systemene; og god forståelse for oppbygning av database-tabeller og hvordan skrive gode og effektive spørringer er derfor viktig.

 

Så vil anbefale deg å utsette det å lære deg databaser litt - slik at du ikke lærer deg masse dårlige uvaner og snarveier fordi man ikke forstår ordentlig hvordan systemet fungerer.

Lenke til kommentar

Se her ja! Takk for svar! Dette skal jeg se litt nærmere på. Er ikke noen racer i database og PHP, driver bare littegranne i Codeigniter da jeg syntes dette var et oversiktelig rammeverk.

 

Driver egentlig mest som front-end designer, og skal nok holde meg til det også. Kan jo ikke lære alt her i verden! :)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...