hente ut data fra flere tabeller i mysql

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009

Sitter å forsøker meg litt på JOIN etc. Men skjønner det ikke helt...

Når artikkler ligger i databasen, i flere tabeller, så bruker man kun ett html dokument (stuktur). Og så kjører man spørringer på ett hoved id'nr for å hente ut riktig innhold.

Hvordan går jeg frem for å hente ut informasjon. Starter med hvordan jeg sammenkjører tabellene...

 

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Joining

Vel, det er flere måter å joine på. Man har left join, right join og "vanlig" join. Som du sikkert har skjønt allerede så kan man lage rimelig komplekse spørringer i MySQL.

Si du har følgende tabeller

  1. users
    user_id, user_name, user_email, ...
  2. articles
    article_id, article_text, ...
  3. relations
    user_id, article_id

Hvis du f.eks vil vise en liste over alle artikler og brukernavnet på den som har skrevet artikkelen, så kan du gjøre det på, så kan du joine på denne måten:

SELECT u.user_name, a.article_text
FROM users u, articles a, relations r
  WHERE u.user_id = r.user_id
   AND a.article_id = r.article_id

Legg merke til at vi bruker alias foran feltene vi ønsker, f.eks. u.user_name - videre i FROM-klausulen så sier vi at tabellen users skal ha aliaset u.

Legg også merke til at vi inkluderer tabellen relations i FROM-klausulen. Ikke fordi vi skal hente ut data fra den, men fordi vi trenger den for å kombinere de andre dataene.

Senere når du skal printe ut noe fra en query som dette med PHP, så gjør du det på vanlig måte, slik:

<?php
print $data['user_name'];
?>

Altså uten aliaset foran. Du kan også velge all informasjon fra de to tabellene ved å bruke SELECT u.*, a* FROM ... og så videre.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
testet slik du har satt opp

testet slik du har satt opp ovenfor her og la til:

<?php

    $query = mysql_query($con);

    $data = mysql_fetch_assoc($query);

?> 

men da får jeg opp:

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result

 

har brukt det slik hele veien når jeg har hentet ut info... men denne gangen funket det ikke. Hva gjør jeg galt?

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Sende spørring som argument

Det sier seg selv at man må sende spørringen som argument i funksjonen mysql_query(). Ovenfor ser det ut som om du bare sender tilkoblingen via $con.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
har jeg overkomplisert

har jeg overkomplisert igjen/tidligere?:

<?php

  require('path/to/db-access-data.php');

  $select = mysql_query(' ... ');

  $query = mysql_query($select, $con);

  $data = mysql_fetch_assoc($query);

?>

Jeg forsøkte, for morro igrunnen, og ta vekk $query og sette: $data = mysql_fetch_assoc($select); Og da funket det smell.

Trur jeg...

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Eget patent

Hvorfor i alle dager finner du på egne måter å gjøre ting på. Du vet da vel hvordan man skriver en query nå? Ovenfor bruker du mysql_query() to ganger, hvor har du lært det? Resultatet fra mysql_query() er alltid et svar fra databasen.

Se tilbake på dine tidligere tråder, så ser du hvordan man kjører en SQL-spørring. Kommer heller ikke til å si dette flere ganger, men bruk sprintf() og mysql_real_escape_string() for å øke sikkerheten og hindre SQL-injections.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
Kikket litt nøyere etter, og

Kikket litt nøyere etter, og så at det var i forbindelse med nettopp sprintf('...') at jeg bruket sistnevnte...

<?php

  require('path/to/db-access-data.php');

  $select = sprintf(' ... ');

  $query = mysql_query($select, $con);

  $data = mysql_fetch_assoc($query);

?>

Beklager...

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Tilgivelse

Du er tilgitt!!!!!1

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
hehee, herlig...

hehee, herlig...

med hilsen
Thomas Kile

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
Men, i mitt hode hørtes dette

Men, i mitt hode hørtes dette logisk ut. men får bare frem samme artikkel. Uansett hvilken ID jeg setter opp.

#1 - Satt opp en link: <a href="side.php?aid=1">Artikkel 1</a>

#2 - På side.php satt jeg opp en spørring mot relasjons-tabellen. Basert på artikkel-ID'en.

#3 - hvis en ID blir funent, så satt jeg opp en ny spørring som ovenfor. Altså, hentet data fra de forskjellige tabellene.

Fikk frem samme artikkel hver eneste gang jeg...

 

Så, hvordan velger jeg en gitt artikkel fra en link?

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Riktig tenkt

Det er riktig måte å gjøre det på det ja, så hodet ditt har nok god logisk sans. :) Du har nok tenkt riktig, men implementert feil.

Få se på den delen av skriptet ditt som er relevant for å velge ut korrekt artikkel da. Gjerne med forklaringer.

Edit; Men det holder med én spørring, du kan så sjekke om en artikkel ble funnet ved hjelp av mysql_num_rows().

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
når du skriver "gjerne med

når du skriver "gjerne med forklaringer" skjønner jeg fort at det jeg har gjort ikke helt er optimalt da det ikke er snakk om mye.

Men her har du den biten som jeg mente at skulle velge riktig data fra databasen:

    // setter id fra linken i en variabel

    $article = mysql_real_escape_string($_GET['aid']);

   

    // setter opp en spørring for å finne en artikkel

    $get_article = sprintf('SELECT * FROM relations WHERE article_id = \'%s\'', $article);

    // kobler opp og kjører spørringen

    $query = mysql_query($get_article, $con);

 

Altså, den henter frem en artikkel da, med ett gitt og eksisterende IDnr. For når jeg forsøker å skive inn en som ikke eksisterer, så får jeg error-meldingen om at den ikke eksisterer. bare at om jeg endrer ID til en annen eksisterende ID, så henter den fortsatt frem den "gamle" da... forstålig?

med hilsen
Thomas Kile

Hjemmeside
Hjemmesides bilde
Avlogget
Bidragsyter
Ble med: 17.06.2008
Spørring på flere tabeller i MySQL

Hvis du allerede vet artikkelID-en, så kan du bruke den til å joine tabellene.

Si f.eks. du vil ha ut informasjon fra brukertabell og artikkeltabell. Det er vanlig hvis man ønsker å vise hvem som har skrevet en artikkel når man ser på artikkelen.

SELECT u.*, a.* FROM users u, articles a, relations r WHERE r.article_id = a.article_id AND r.user_id = u.user_id AND a.article_id = DIN_ARTIKKEL_ID

Denne spørringen vil hente ut all informasjon om brukeren som har skevet en gitt artikkel fra brukertabellen og all informasjon om artikkelen du spesifiserer artikkelID-en for fra artikkeltabellen.

ThomasK
ThomasKs bilde
Avlogget
Donator
Ble med: 30.12.2009
det ser veldig "manuelt" ut

det ser veldig "manuelt" ut da... eller. Litt som jeg allerede har det?

jeg har fått til å hente ut informasjon fra alle 4 tabellene (kategori, type, forfatter, artikkel) via relasjonstabellen da. Slik:

    if(mysql_num_rows($query)) {   

        $join = mysql_query('

                        SELECT

                            cat.category_name,

                            typ.type_name,

                            aut.author_name,

                            art.*

                        FROM category cat,

                            type typ,

                            author aut,

                            article art,

                                relations rel

                        WHERE art.article_id = '$article'

                            AND aut.author_id = rel.rel_author_id

                            AND typ.type_id = rel.rel_type_id

                            AND cat.category_id = rel_category_id

                    ");

       

            $data = mysql_fetch_assoc($join);

EDIT! (det som er uthevet m/fet skrift)

hadde satt rel.rel_article_id, noe som resulterte i at den ikke tok forbehold om "aid"-variablen.

men der har du i og for seg hele scriptet. Tips til å forkorte det hele? Du snakket om en mulighet tidligere...

med hilsen
Thomas Kile

Svar på forumemnet

(If you're a human, don't change the following field)
Your first name.
Innholdet i dette feltet blir holdt privat og vil ikke bli vist offentlig.