Avatar billede ofirpeter Nybegynder
02. august 2006 - 13:52 Der er 11 kommentarer og
1 løsning

Flere inner joins

Hej eksperter. Jeg har et problem med at tilføje en ekstra inner join i min sql query.

Denne virker som den skal:

SELECT *, COUNT(rubrikid) AS antal FROM annonce INNER JOIN tekster ON annonce.tekstid = tekster.tekstid WHERE annonce.status = '0' AND annonce.annoncetypeid = '1' AND ((`tekst` LIKE '%cykel%' ) OR (`overskrift` LIKE '%cykel%' ) ) GROUP BY rubrikid ORDER BY rubrikid DESC

Jeg ønsker dog at den ikke skal sorteres efter "rubrikid" som den bliver nu. Men efter "sektionsid", som ligger i tabellen sektioner. De to tabeller har rubrikid til fælles.

Hvordan indfører jeg en inner join der får tabellen "sektioner" med, så jeg kan sortere efter "sektionsid"?
Avatar billede barklund Nybegynder
02. august 2006 - 14:04 #1
Du tilføjer den vel bare? Hvilken tabel har rubrikid nu? annonce?

SELECT
*,
COUNT(1) AS antal
FROM
annonce
  INNER JOIN tekster ON annonce.tekstid = tekster.tekstid
  INNER JOIN sektion ON sektion.rubrikid = annonce.rubrikid
WHERE
annonce.status = '0' AND
annonce.annoncetypeid = '1' AND
(
  (`tekst` LIKE '%cykel%' ) OR
  (`overskrift` LIKE '%cykel%' )
)
GROUP BY rubrikid
ORDER BY sektion.sektionid DESC

Nu med lidt opsætning - så bliver det som oftest meget nemmere at overskue :)

--
Morten Barklund
Avatar billede ofirpeter Nybegynder
02. august 2006 - 14:17 #2
Hej barklund. Tror jeg fik formuleret mig lidt dårligt. Det jeg ønsker er at tabellen "rubrikker" skal med, da mine data skal sorteres efter "sektionid" i denne tabel.
Jeg prøvede dette:

SELECT
*,
COUNT(1) AS antal
FROM
annonce
  INNER JOIN tekster ON annonce.tekstid = tekster.tekstid
  INNER JOIN rubrikker ON rubrikker.rubrikid = annonce.rubrikid
WHERE
annonce.status = '0' AND
annonce.annoncetypeid = '1' AND
(
  (`tekst` LIKE '%cykel%' ) OR
  (`overskrift` LIKE '%cykel%' )
)
GROUP BY rubrikid
ORDER BY rubrikker.sektionid DESC

Men får følgende fejl:"Column: 'rubrikid' in field list is ambiguous"

(Smart med opsætningen ;)
Avatar billede ofirpeter Nybegynder
02. august 2006 - 14:18 #3
Jeg har altså rettet i linie 7 og i den sidste.
Avatar billede barklund Nybegynder
02. august 2006 - 14:28 #4
i group by, skriv annonce.rubrikid, og så skulle det vist virke :)
Avatar billede ofirpeter Nybegynder
02. august 2006 - 14:44 #5
Fantastisk, så virker det! Så lige at du har skrevet COUNT(1) istedet for COUNT(rubrikid). Hvordan kan det lade sig gøre?
Avatar billede ofirpeter Nybegynder
02. august 2006 - 14:50 #6
Hvis jeg må luske et spørgsmål mere ind.
Er det så muligt at gruppere "sektionid" således at de kun skrives en gang, når jeg løber basen igennem. Det var så meningen at alle rubrikid'erne skulle stå under det "sektionid" de er tilknyttet.
Avatar billede barklund Nybegynder
02. august 2006 - 15:07 #7
Lav group by om til rubrikker.sektionid i stedet - hvis det er det, du mener.

Og COUNT(1) er oftest lidt smartere, da du jo bare skal tælle rækkerne.
Avatar billede ofirpeter Nybegynder
02. august 2006 - 15:44 #8
Mit problem ligger i at når jeg kører min while løkke:

    while( $row = mysql_fetch_array($hent_annoncer) ) {
        $rubrikid = $row['rubrikid'];
        $sektionid = $row['sektionid'];
        $antal = $row['antal'];
        echo "$sektionid: $rubrikid($antal)<br>";
    }

Så får jeg f.eks. udskrevet:
2: 2(2)
2: 8(1)
3: 105(1)
3: 84(1)

Det der genere mig er, at sektionid'et kommer ud flere gange.
Kan jeg gruppere det sådan at det kommer ud som følger?

2: 2(2) ; 8(1)
3: 105(1) ; 84(1)
Avatar billede barklund Nybegynder
02. august 2006 - 15:52 #9
Det kan du jo selv lave i din PHP - så længe sektion-id er det samme, behandl kun den ene del - som:

    $prev_sektion = null;
    while( $row = mysql_fetch_array($hent_annoncer) ) {
        $rubrikid = $row['rubrikid'];
        $sektionid = $row['sektionid'];
        $antal = $row['antal'];
        if ($prev_sektion != $sektionid) {
            echo "<br>$sektionid: ";
        } else {
            echo ", ";
        }
        echo "$rubrikid($antal)";
    }

SQL kan ikke gruppere på to niveauer på den måde, som du ønsker.
Avatar billede barklund Nybegynder
02. august 2006 - 15:53 #10
Hov, husk at opdatere:

    $prev_sektion = null;
    while( $row = mysql_fetch_array($hent_annoncer) ) {
        $rubrikid = $row['rubrikid'];
        $sektionid = $row['sektionid'];
        $antal = $row['antal'];
        if ($prev_sektion != $sektionid) {
            echo "<br>$sektionid: ";
            $prev_sektion = $sektion_id;
        } else {
            echo ", ";
        }
        echo "$rubrikid($antal)";
    }
Avatar billede ofirpeter Nybegynder
02. august 2006 - 16:07 #11
Super! Mange tak, du har været en kæmpe hjælp. Jeg bliver klogere og klogere.
Avatar billede barklund Nybegynder
02. august 2006 - 16:48 #12
Og 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
Computerworld tilbyder specialiserede kurser i database-management

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