Avatar billede tanzaweb Nybegynder
12. august 2004 - 13:28 Der er 8 kommentarer og
1 løsning

Kan man lave en DISTINCT og Join i samme query?

Hej

Jeg kun godt tænke mig at høre om man kan kombinere en DISTINCT og JOIN query i samme query da jeg har en kalender hvor den viser navnet på en bruger, fra en tabel, og nogle tal fra en anden taebl, fra den 3 tabel skal den hente årstallet, som kun skal vises en gang.

Jeg har prøvet noget i denne retning men kan ikke få det til at virke:

SELECT DISTINCT hotel_location FROM hotels

$kon = mysql_query("SELECT DISTINCT aars_tal FROM aar WHERE aar.aar_id = Kalender.aar_id AND Kalender.*,users.* FROM Kalender INNER JOIN users ON (Kalender.user_id = users.user_id)");
                    ?>
<?php while ($month = mysql_fetch_array($kon)){

}?>
Avatar billede arne_v Ekspert
12. august 2004 - 13:32 #1
Prøv:

SELECT DISTINCT aaar.aars_tal,Kalender.*,users.*
FROM aar,Kalender, users
WHERE aar.aar_id = Kalender.aar_id AND Kalender.user_id = users.user_id
Avatar billede arne_v Ekspert
12. august 2004 - 13:32 #2
Du kan også godt lave det med JOIN men du skal have hele select listen inden
du begynder at angive tabel navne.
Avatar billede tanzaweb Nybegynder
12. august 2004 - 13:53 #3
jeg kan li at bruge join så det har jeg prøvet virker dog ikke, har prøvet at ændre den så den ligner det eks. du har lavet.

$kon = mysql_query("SELECT DISTINCT aaar.aars_tal,Kalender.*,users.* FROM aar,Kalender INNER JOIN users ON (aar.aar_id = Kalender.aar_id AND Kalender.user_id = users.user_id)");

mangler der noget da den siger: Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource
Avatar billede arne_v Ekspert
12. august 2004 - 13:57 #4
Prøv:

SELECT DISTINCT aaar.aars_tal,Kalender.*,users.*
FROM (aar INNER JOIN Kalender ON aar.aar_id = Kalender.aar_id)
      INNER JOIN users ON Kalender.user_id = users.user_id
Avatar billede tanzaweb Nybegynder
12. august 2004 - 14:08 #5
Det virker fint, på nær at den viser årstallet 2 gange hvor jeg gerne vil have den til at vise årstallet kun en gang men resten af dataerne skal den vise som en alm. while udskrivning:

Nogenlunde således:
år 2005
malene 0-0-0-0-0-0-1-0-0-0-0-0
lis 0-0-0-0-0-0-0-0-1-0-0-0

I øjeblikket skriver den således

år 2005
malene 0-0-0-0-0-0-1-0-0-0-0-0
år 2005
lis 0-0-0-0-0-0-0-0-1-0-0-0

se hele koden her:

$kon = mysql_query("SELECT DISTINCT aar.aars_tal,Kalender.*,users.*FROM (aar INNER JOIN Kalender ON aar.aar_id = Kalender.aar_id) INNER JOIN users ON Kalender.user_id = users.user_id");
                    //SELECT Kalender.*,users.* FROM Kalender INNER JOIN users ON (Kalender.user_id = users.user_id
                    ?>
                <td colspan="13" align="center"></td>
            </tr>
            <?php while ($month = mysql_fetch_array($kon)){
            ?>
            <tr>
                <td colspan="13" class="KalHead" align="center"><b><?php echo $month['aars_tal']; ?></b></td>
            </tr>
            <tr>
                <td class="KalHead">&nbsp;</td><td align="center" width="30" class="KalHead">Jan</td><td width="30" align="center" class="KalHead">Feb</td><td align="center" width="30" class="KalHead">Mar</td><td align="center" width="30" class="KalHead">Apr</td><td align="center" width="30" class="KalHead">Maj</td><td align="center" width="30" class="KalHead">Jun</td><td align="center" width="30" class="KalHead">Jul</td><td align="center" width="30" class="KalHead">Aug</td><td align="center" width="30" class="KalHead">Sept</td><td align="center" width="30" class="KalHead">Okt</td><td align="center" width="30" class="KalHead">Nov</td><td align="center" width="30" class="KalHead">Dec</td>
            </tr>
           
            <tr>
                <td class="KalHead"><?php echo $month['first_name']; ?></td><td align="center" class="Kaltext"><?php echo $month['Januar']; ?></td><td class="Kaltext" align="center"><?php echo $month['Februar']; ?></td><td class="Kaltext" align="center"><?php echo $month['Marts']; ?></td><td class="Kaltext" align="center"><?php echo $month['April']; ?></td><td class="Kaltext" align="center"><?php echo $month['Maj']; ?></td><td class="Kaltext" align="center"><?php echo $month['Juni']; ?></td><td class="Kaltext" align="center"><?php echo $month['Juli']; ?></td><td class="Kaltext" align="center"><?php echo $month['August']; ?></td><td class="Kaltext" align="center"><?php echo $month['September']; ?></td><td class="Kaltext" align="center"><?php echo $month['Oktober']; ?></td><td class="Kaltext" align="center"><?php echo $month['November']; ?></td><td class="Kaltext" align="center"><?php echo $month['December']; ?></td>
            </tr>
            <?php } ?>
Avatar billede arne_v Ekspert
12. august 2004 - 14:11 #6
Det kan du ikke lave i SQL.

Men det kan du lave i din PHP kode.

Du tester simpelthen på om årstaller er det samem som sidst og hvis det er det
så undlader du at skrive det ud.
Avatar billede tanzaweb Nybegynder
12. august 2004 - 14:15 #7
ok smid et svar til pointene.

er det fordi der er andre dataer involveret?

Jeg har brugt DISTINCT til at liste nogle hoteller under byer, så den ikke viste byerne flere gange
Avatar billede arne_v Ekspert
12. august 2004 - 14:18 #8
svar
Avatar billede arne_v Ekspert
12. august 2004 - 14:19 #9
En SELECT returnerer altid en matrix af data. Alle rækker har samme antal felter.

Det du vil have er:

1 række med 1 felt med årstal
N rækker med X felter med diverse info
1 række med 1 felt med årstal
N rækker med X felter med diverse info

og det kan du ikke i SQL, men det er nemt at simulere via lidt kode i ens
applikation (PHP side eller andet).

DISTINCT gør kun at den ikke returnerer duplikat rækker.
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