Avatar billede snigeren Nybegynder
15. juli 2007 - 14:56 Der er 20 kommentarer og
1 løsning

Hente data fra én i forhold til en anden tabel, INNER JOIN måske?

Det her er for meget for mig :D

Der hentes følgende fra første tabel: shop_content
varegruppeID
varenr
beskrivelse
dimension
enhed
pris

Fra anden tabel "shop_surface_dd" skal jeg så bruge alle data der har samme "varenr" som i tabellen ovenfor.

Jeg tænkte på at bruge følgende og smide en ny $query ind midt i while sætningen, men tror måske det er lidt skidt at lave så mange kald til db´en, det må kunne gøre smartere:

$query1 = mysql_query("SELECT * FROM shop_content where varegruppeID=" . $_GET["varegruppeID"] . "")or die(mysql_error());

while($row = mysql_fetch_array($query1))
{
echo '<tr><td align="left">' . $row["varenr"] . '</td><td align="left" width="50%">' . $row["beskrivelse"] . '</td><td align="right">' . $row["dimension"] . '</td><td align="right"><select name="select1"><option>value 1</option><option>value 2</option></select></td><td align="right">' . $row["enhed"] . '</td><td align="right">' . number_format($row["pris"], 2, ",", ".") . '&nbsp;kr.</td><td align="right">&nbsp;' . $row["prisenhed"] . '</td><td></td><td align="center"><a href="cart.php?action=add_item&id=' . $row["id"] . '&qty=1"><img src="gfx/cart.gif" width="21" height="17"></a></td><td></td></tr>';
echo '<tr><td colspan="9">&nbsp;</td></tr>';
echo '<tr><td colspan="8"><img src="gfx/brown_dot.gif" width="100%" height="1"></td><td></td></tr>';
echo '<tr><td colspan="9">&nbsp;</td></tr>';
}

Der hvor der bare står value1 og value2... i dropdown menuen skal jeg hente alle data fra tabellen shop_surface_dd WHERE varenr= varenr fra &query1

Dvs. så jeg får en dropdown menu med de surfaces der hører til den pågældende vare.

Min hjerne kan simpelthen ikke regne ud hvordan den skral grejes.

Jeg håber virkelig en eller anden venlig sjæl vil bruge lidt tid på dette spørgsmål.
Avatar billede barklund Nybegynder
15. juli 2007 - 15:32 #1
Hvis du vil undgå mange kald til db'en, kan det godt gøres i et kald - men det tror jeg ikke er en fordel her. Jeg tror du skal holde det, som det er nu...
Avatar billede jakobdo Ekspert
15. juli 2007 - 15:32 #2
Din forklaring er måske lidt kryptisk, men kunne det være:

SELECT
    sc.varegruppeID,
    sc.varenr,
    sc.beskrivelse,
    sc.dimension,
    sc.enhed,
    sc.pris
FROM
    shop_content AS sc
INNER JOIN
    shop_surface_dd AS ssd
ON
    sc.varenr = ssd.varenr
WHERE sc.varegruppeID = intval($_GET["varegruppeID"])
Avatar billede barklund Nybegynder
15. juli 2007 - 17:03 #3
Så vælger han jo ikke noget fra ssd - og så kan join være ligemeget. Hvis du gerne vil have alt fra surface-tabellen, så kan du bruge group_concat, og lave group by på varenr... ikke det pæneste i verden, men så er det kun en query, og så kan du splitte over hvad du group_concat'ede på og hive surfaces ud den vej rundt :)
Avatar billede jakobdo Ekspert
15. juli 2007 - 17:15 #4
Ja, men jeg var nu heller ikke 100% sikker på hvad det er snigeren helt præcist ønsker. :o)
Avatar billede snigeren Nybegynder
15. juli 2007 - 22:29 #5
ok jeg prøver lige at beskrive hvad jeg vil med ord og ikke kode blandet ind i det, jeg kunne heller ikke selv lige overskue det hele da jeg skrev spørgsmålet  =)

Jeg har en række produkter i shop_content. Hele problemet er at de produkter KAN have forskellige overflader/farver og man skal så kunne vælge imellem de gældende farver til hvert produkt. Derfor har jeg lavet en tabel der holder styr på hvilke overflader/farver de forskellige produkter kan have. Den hedder shop_surface_dd (dd for dropdown smart ikke =)

dvs. det eneste der skal i den dropdown menu er overfladerne/farverne som i shop_surface_dd hedder "surfacenavn"  (ved godt jeg blander lidt sprog sammen)

Dvs. jeg henter en vare fra shop_content, den vare har så et varenr som jeg skal bruge for at hente de tilhørende overflader/farver fra shop_surface_dd tabellen.

Herunder skriver jeg lige de to forskellige tabel strukturer:

shop_content:
id
varegruppeID  (denne bruges bare til at inddele varerne i forskellige kategorier)
varenr
beskrivelse
dimension
enhed
pris
prisenhed

shop_surface_dd:
id
varenr
farvekode    (en bestemt kode for hver farve)
surfacenavn  (bare navnet på en farve)

Håber I forstår hele idéen nu =)

Men jeg er ikke helt vildt inde i inner join så I må lige bære over med mig.
Avatar billede jakobdo Ekspert
16. juli 2007 - 07:29 #6
Så skal du lave som du prøvede tidligere....

SQL som henter info om varen...

VIS DATA FRA VARE_SQL.
SQL som henter info fra SHOP_SURFACE_DD
KODE SOM LAVE DROPDOWN
Og evt. mere VIS DATA FRA VARE_SQL.
Avatar billede barklund Nybegynder
16. juli 2007 - 08:19 #7
Et resultat sæt har kun to dimensioner. Det består af en række felter (fastlåst antal) og en række rækker (variabelt antal). Du vil jo gerne have 2 ekstra dimensioner - du vil for hver række have yderligere et resultatsæt med felter og rækker, som angiver den enkelte surface. Det kan man ikke - det er en helt grundlæggende sql-konsekvens.

Men du kan hente det ud som:

1) varenr
2) beskrivelse
3) overflader
---------
1) 1
2) En vare
3) overflade1,overflade2,overflade3

Altså så overfladerne kommer i resultatsættet som et felt i hver række - og så ligger som en komma-separeret streng.

--
Morten Barklund
Avatar billede snigeren Nybegynder
16. juli 2007 - 09:58 #8
ok så det er ikke nødvendigt at lave en inner join? bare en query og en while i den første while sætning?

Er det i øvrigt nødvendigt med en form rundt om select´en? eller er det irrelevant?
Avatar billede barklund Nybegynder
16. juli 2007 - 10:12 #9
FORM er vist ikke nødvendigt, men nogle input felter skifter funktion alt efter om de er e i en form eller ej, så lad den bare være, med mindre det giver deciderede fejlmuligheder :)

Og du kan godt lave en INNER JOIN, men ikke for at optimere - blot for at ændre lidt :)
Avatar billede snigeren Nybegynder
16. juli 2007 - 11:31 #10
hehe ok,.. well jeg prøver mig frem =) tak so far, jeg venter lige med at lukke til jeg er sikker på om det virker nemmere at snakke videre i samme Q =)
Avatar billede snigeren Nybegynder
16. juli 2007 - 16:31 #11
jeg har prøvet med følgende men kan ikke lige få det til at virke,.. den kommer med denne standard fejl:

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1


min kode ser nu således ud:
Koden i starten af dokumentet:

<?php

    // This page will list all of the items
    // from the items table. Each item will have
    // a link to add it to the cart

    include("db.php");
   
    // Get a connection to the database
    $cxn = @ConnectToDb($dbServer, $dbUser, $dbPass, $dbName);
   
    $query1 = mysql_query("SELECT * FROM shop_content where varegruppeID=" . $_GET["varegruppeID"] . "")or die(mysql_error());
    $query2 = mysql_query("SELECT * FROM shop_varetype where varegruppeID=" . $_GET["varegruppeID"] . "")or die(mysql_error());
    $query3 = mysql_query("SELECT * FROM shop_surface_dd WHERE varenr=" . $_GET["varenr"] . "")or die(mysql_error());
    $row2 = mysql_fetch_array($query2);
   
?>

og selve koden i tabellen:

while($row = mysql_fetch_array($query1))
                    {
                      echo '<tr><td align="left">' . $row["varenr"] . '</td><td align="left" width="50%">' . $row["beskrivelse"] . '</td><td align="right">' . $row["dimension"] . '</td><td align="right"><select name="select1">';
                      while($row3 = mysql_fetch_array($query3))
                      {
                        echo '<option>' . $row3["surfacenavn"] . '</option>';
                      }
                      echo '</select></td><td align="right">' . $row["enhed"] . '</td><td align="right">' . number_format($row["pris"], 2, ",", ".") . '&nbsp;kr.</td><td align="right">&nbsp;' . $row["prisenhed"] . '</td><td></td><td align="center"><a href="cart.php?action=add_item&id=' . $row["id"] . '&qty=1"><img src="gfx/cart.gif" width="21" height="17"></a></td><td></td></tr>';
                      echo '<tr><td colspan="9">&nbsp;</td></tr>';
                      echo '<tr><td colspan="8"><img src="gfx/brown_dot.gif" width="100%" height="1"></td><td></td></tr>';
                      echo '<tr><td colspan="9">&nbsp;</td></tr>';
                    }
Avatar billede snigeren Nybegynder
16. juli 2007 - 16:38 #12
hvis jeg fjerne nedenstående linie fra toppen kommer fejlen ikke. Men jeg kan så ikke lige finde ud af hvor jeg ellers skal putte den.

$query3 = mysql_query("SELECT * FROM shop_surface_dd where varenr=" . $_GET["varenr"] . "")or die(mysql_error());
Avatar billede barklund Nybegynder
16. juli 2007 - 16:52 #13
Ehm, finder $_GET['varenr']? Er der en variabel, der hedder det?
Avatar billede snigeren Nybegynder
16. juli 2007 - 17:08 #14
uhm det er jo lige det =)
Altså jeg skal jo bruge varenr fra shop_content til at finde de rigtige overflader/farver fra shop_surface_dd. Derfor håbede jeg at man kunne gøre noget lignende.
Hvordan skal jeg ellers få fat i variablen varenr fra den gældne vare der bliver vist i denne while($row = mysql_fetch_array($query1))?
Avatar billede barklund Nybegynder
16. juli 2007 - 17:23 #15
Jamen, du skal da ikke indsætte $_GET['varenr'], hvis variablen, som du skal bruge, ligger i $row['varenr']? Det siger da sig selv :)

Du skal jo bare indsætte den det rigtige sted med den rigtige variabel:

  while($row = mysql_fetch_array($query1))
                    {
                    $query3 = mysql_query("SELECT * FROM shop_surface_dd WHERE varenr=" . $row["varenr"] . "")or die(mysql_error());


For eksempel :)

--
Morten Barklund
Avatar billede snigeren Nybegynder
16. juli 2007 - 17:52 #16
ja ok syrealistisk,.. det mente jeg at jeg havde prøvet.. men nej :D

Det virker jo tark ska du ha du gamle ^ ^

koden kom til at se således ud:

while($row = mysql_fetch_array($query1))
                    {
                      echo '<tr><td align="left">' . $row["varenr"] . '</td><td align="left" width="50%">' . $row["beskrivelse"] . '</td><td align="right">' . $row["dimension"] . '</td><td align="right"><select name="select1">';
                      $query3 = mysql_query("SELECT * FROM shop_surface_dd WHERE varenr=" . $row["varenr"] . "")or die(mysql_error());
                      while($row3 = mysql_fetch_array($query3))
                      {
                        echo '<option>' . $row3["surfacenavn"] . '</option>';
                      }
                      echo '</select></td><td align="right">' . $row["enhed"] . '</td><td align="right">' . number_format($row["pris"], 2, ",", ".") . '&nbsp;kr.</td><td align="right">&nbsp;' . $row["prisenhed"] . '</td><td></td><td align="center"><a href="cart.php?action=add_item&id=' . $row["id"] . '&qty=1"><img src="gfx/cart.gif" width="21" height="17" border="0"></a></td><td></td></tr>';
                      echo '<tr><td colspan="9">&nbsp;</td></tr>';
                      echo '<tr><td colspan="9"><img src="gfx/brown_dot.gif" width="100%" height="1"></td><td></td></tr>';
                      echo '<tr><td colspan="9">&nbsp;</td></tr>';
                    }
Avatar billede snigeren Nybegynder
16. juli 2007 - 17:54 #17
Siger du man kan skrive det som inner join oxo? Jeg kunne godt tænke mig at se det som inner join hvis det ikke tager dig aaalt for lang tid at skrive =)

Men uanset hvad,.. kyler du lige et svar? =)

So far tak for hjælpen
Avatar billede barklund Nybegynder
16. juli 2007 - 18:20 #18
Altså for at få det hele fra alle tre tabeller, kan du:

$query1 = mysql_query("
SELECT sc.varenr, sc.beskrivelse, sc.dimension, sc.enhed, sc.prisenhed, sc.pris, sc.id, GROUP_CONCAT(ss.surfacenavn, ",") AS surfaces
FROM shop_content AS sc
LEFT JOIN shop_surface_dd AS ss ON sc.varenr = ss.varenr
WHERE sc.varegruppeID='" . $_GET["varegruppeID"] ."'
GROUP BY sc.varenr, sc.beskrivelse, sc.dimension, sc.enhed, sc.prisenhed, sc.pris, sc.id
)or die(mysql_error());

Så er din løkke istedet:

    while($row = mysql_fetch_array($query1))
                    {
                      echo '<tr><td align="left">' . $row["varenr"] . '</td><td align="left" width="50%">' . $row["beskrivelse"] . '</td><td align="right">' . $row["dimension"] . '</td><td align="right"><select name="select1">';
                      echo '<option>' join(explode($row["surfaces"],','),'</option><option>') . '</option>';
                      echo '</select></td><td align="right">' . $row["enhed"] . '</td><td align="right">' . number_format($row["pris"], 2, ",", ".") . '&nbsp;kr.</td><td align="right">&nbsp;' . $row["prisenhed"] . '</td><td></td><td align="center"><a href="cart.php?action=add_item&id=' . $row["id"] . '&qty=1"><img src="gfx/cart.gif" width="21" height="17" border="0"></a></td><td></td></tr>';
                      echo '<tr><td colspan="9">&nbsp;</td></tr>';
                      echo '<tr><td colspan="9"><img src="gfx/brown_dot.gif" width="100%" height="1"></td><td></td></tr>';
                      echo '<tr><td colspan="9">&nbsp;</td></tr>';
                    }

Men om det er en fordel ved jeg ikke. Bruger du overhovedet row2 til noget? Jeg kunne ikke se den, så jeg har ikke taget den med, men hvis du gør, så skal du også innerjoin'e med den.

--
Morten Barklund
Avatar billede barklund Nybegynder
16. juli 2007 - 18:21 #19
Og et svar
Avatar billede snigeren Nybegynder
16. juli 2007 - 20:22 #20
mjaa jeg har meget at lære endnu :P

men endnu engang tak for hjælpen,.. nu vil jeg pakke, 5 dage i Milano =)
Avatar billede barklund Nybegynder
17. juli 2007 - 09:10 #21
Mjæs, tark for points...
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