2 databaser

Tags:    php


Fold kodeboks ind/udKode 

Nu få jeg en lang list over forestillinger.
I databasen ’billetter’ er der en kolonne der hedder forestilling_id. Og en kolonne der hedder 'ialt’(antal billetter pr bestilling )

Men hvordan bygge jeg det hele sammen, så jeg ved hvor mange billetter der er solgt pr. forstilling ?

$result = mysql_query("select * from billetter WHERE forestilling_id = '$id_02 '");
while ($row = mysql_fetch_array($result)) {
$ialt = $row["ialt"];
$billeter_ialt = $billeter_ialt + $ialt;
}




Indlæg senest redigeret d. 26.08.2007 21:23 af Bruger #10441
7 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 1 karma
Sorter efter stemmer Sorter efter dato
Fold kodeboks ind/udKode 


Prøv den - jeg tror der manglede mellemrum i din query.



Ingen grund til alt det PHP kode. SQL kan klare det hele. Du skal have fat i LEFT JOIN kommandoen, her er et eksempel:
Fold kodeboks ind/udKode 

Det denne kommando gør, er at den tager alle poster i billetter, som passer til forestillingen, og tæller dem med den gode gamle COUNT(b.id).

PS. Jeg har ikke testet dette, men jeg er ret sikker på at det virker. Ellers må du lige skrive igen, så skal jeg kigge på det :)



Ingen grund til alt det PHP kode. SQL kan klare det hele. Du skal have fat i LEFT JOIN kommandoen, her er et eksempel:
Fold kodeboks ind/udKode 

Det denne kommando gør, er at den tager alle poster i billetter, som passer til forestillingen, og tæller dem med den gode gamle COUNT(b.id).

PS. Jeg har ikke testet dette, men jeg er ret sikker på at det virker. Ellers må du lige skrive igen, så skal jeg kigge på det :)


Tak for et hurtig svar :-)
Jeg er over hovedet ikke med, det er helt sort for mig.
Jeg ved godt at SQL kan rigtigt meget, men hvordan skal jeg bygge det sammen med php ? og hvad gør LEFT JOIN kommandoen ?




Indlæg senest redigeret d. 26.08.2007 21:52 af Bruger #10441
Okay, du får lige en forklaring så :)

LEFT JOIN kommandoen kan tage data fra en anden tabel. Så det queryen gør, er at den tager forestillingerne ud, og så tager den bagefter alle de billetter der er bestilt, som passer dertil.

Men først nu har jeg indset, at jeg har misforstået dit tabeldesign. Det kræver en lidt anden løsning, men igen skal vi bruge et LEFT JOIN.

Først den query man ville bruge, for at hive alle forestillinger, samt antal bestilte pladser, ud:
Fold kodeboks ind/udKode 

Lad os tage den ét skridt af gangen.

Som det ses, så navngiver jeg tabellerne i querien. Det gøres for at gøre det nemmere at referere til tabeller. Jeg har brugt 'f' til at beskrive 'forestillinger' og 'b' til 'billetter'.

Så er der så vores LEFT JOIN. LEFT JOIN tager alle de poster, som opfylder dens krav, i dette tilfælde, alle poster i 'billetter', som har et forestilling_id svarende til forestillingens id.

Problemet med dette er så, at vi prøver at tage summen af alle b.ialt felterne. Det kan man ikke, hvis man kun vil returnere én post per forestilling, som vi vil. Det løser vi med GROUP BY kommandoen. Ved hjælp af den kan vi få vores resultater grupperet efter forestillingens id.

Sidst er der AS kommandoen. Med den kan vi navngive vores SUM(b.ialt), og i dette tilfælde kalder vi den for ialt.

Så det vores query faktisk gør, er at den hiver en liste over forestillinger ud, og så finder den antal pladser der er bestilt til forestillingen, og ligger dette i et felt i den data vi får tilbage.

Dette kunne man så bruge fra PHP sådan her:
Fold kodeboks ind/udKode 
Så nemt er det :) Sig endelig til hvis det stadig er sort snak, men håber jeg fik det ned på et niveau hvor det kan forstås af alle :P.



Indlæg senest redigeret d. 27.08.2007 06:41 af Bruger #2330
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in prove.php on line 11

include ('data.php');
$q = "SELECT f.*, SUM(b.ialt) AS ialt";
$q .= "FROM test_forestillinger f";
$q .= "LEFT JOIN test_billetter b";
$q .= "ON f.id = b.forestilling_id";
$q .= "GROUP BY f.id";
$q .= "ORDER BY f.id ASC";

$result = mysql_query($q);
while($row = mysql_fetch_array($result))
{
$id = $row['id'];
$lang = $row['lang'];
$dato = $row['dato'];
$antal_pladser = $row['antal_pladser'];
$pladser_taget = $row['ialt'];
echo "$id - $lang - $dato - $antal_pladser - $pladser_taget<br>";
}


Line 11 “while($row = mysql_fetch_array($result))”

Mine to data baser
ID i database forestillinger, er det samme tal kolonnen forestilling_id.

CREATE TABLE `billetter` (
`id` int(5) NOT NULL auto_increment,
`forestilling_id` int(2) NOT NULL default '0',
`navn` varchar(50) NOT NULL default '',
`voksen` int(2) NOT NULL default '0',
`born` int(2) NOT NULL default '0',
`ialt` int(2) NOT NULL default '0',
`dato` varchar(50) NOT NULL default '',
`email` varchar(50) NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

CREATE TABLE `forestillinger` (
`id` int(11) NOT NULL auto_increment,
`lang` varchar(50) NOT NULL default '',
`dato` varchar(50) NOT NULL default '',
`antal_pladser` int(3) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=15 ;




Indlæg senest redigeret d. 27.08.2007 12:06 af Bruger #10441
Det her virke som det skal !
Det er også på et niveau, hvor jeg kan være med :lol:

Fold kodeboks ind/udKode 




Indlæg senest redigeret d. 27.08.2007 13:17 af Bruger #10441
Ah ja, min fejl. Som Niklas påpegede, manglede jeg at tilføje mellemrum for hver linje :). Man kunne også tilføje \\n, hvis man ville, men mellemrum er lige så godt.



t